Android – 如何将通知设置为将来的特定date?

编辑:解决! 是否曾经想要从某个特定的时间点开始通知(当一个活动开始或按下某个button时?)阅读更多信息以了解如何:

//Set a notification in 7 days Calendar sevendayalarm = Calendar.getInstance(); sevendayalarm.add(Calendar.DATE, 7); Intent intent = new Intent(this, Receiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 001, intent, 0); AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, sevendayalarm.getTimeInMillis(), pendingIntent); 

这是Receiver类的代码

 public class Receiver extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Intent intent = new Intent(this, Test.class); long[] pattern = {0, 300, 0}; PendingIntent pi = PendingIntent.getActivity(this, 01234, intent, 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.depressiontest) .setContentTitle("Take Questionnaire") .setContentText("Take questionnaire for Duke Mood Study.") .setVibrate(pattern) .setAutoCancel(true); mBuilder.setContentIntent(pi); mBuilder.setDefaults(Notification.DEFAULT_SOUND); mBuilder.setAutoCancel(true); NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(01234, mBuilder.build()); } } 

不要忘记在清单中添加下面的权限!

 <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <service android:name=".Receiver2" android:enabled="true"> <intent-filter> <action android:name="NOTIFICATION_SERVICE" /></intent-filter> </service> 

不要忘记给下面的清单权限

 <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> 

您的广播接收机注册将是这样的

  <receiver android:name=".AlarmReceiver" > <intent-filter> <action android:name="NOTIFICATION_SERVICE" /> </intent-filter> </receiver> 

一个重要的事情要注意:当用一个Intent-Filter注册您的广播接收机时,您需要添加exported属性并将其设置为false。 喜欢这个:

 <service android:name=".utility.AlarmReceiver" android:exported="false"> <intent-filter> <action android:name="NOTIFICATION_SERVICE" /> </intent-filter> </service> 

其他应用程序的其他组件将能够调用或与您的服务交互。

Google的完整解释:

 android:exported Specifies whether or not components of other applications can invoke the service or interact with it — "true" if they can, and "false" if not. When the value is "false", only components of the same application or applications with the same user ID can start the service or bind to it. The default value depends on whether the service contains intent filters. The absence of any filters means that it can be invoked only by specifying its exact class name. This implies that the service is intended only for application-internal use (since others would not know the class name). So in this case, the default value is "false". On the other hand, the presence of at least one filter implies that the service is intended for external use, so the default value is "true".