【发布时间】:2013-05-01 05:46:11
【问题描述】:
我在从警报管理器运行服务时遇到问题。
我正在构建一个应用程序,在他的 Facebook 朋友的命名日通知所有者。这一切都很好,但通知不会出现。
我已经设置了一个 AlarmTask,它创建了 PendingIntent 并设置了 AlarmManager,如下所示:
public void run() {
// Request to start are service when the alarm date is upon us
Intent intent = new Intent(context, NotifyService.class);
intent.putExtra(NotifyService.INTENT_NOTIFY, true);
intent.putExtra("notifyID", ID);
PendingIntent pendingIntent = PendingIntent.getService(context, ID, intent, 0);
// Sets an alarm - note this alarm will be lost if the phone is turned off and on again
am.set(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), pendingIntent);
}
每个命名日的 ID 都是特定的。
现在在我的 NotifyService 中,我已经设置了这些:
@Override
public void onCreate() {
super.onCreate();
System.out.println("NOTIFICATION SERVICE onCreate()");
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
System.out.println("INTENT RECIEVED: " + intent + " " + flags + " " + startId);
// If this service was started by out AlarmTask intent then we want to show our notification
if(intent.getBooleanExtra(INTENT_NOTIFY, false)){
int ID = intent.getIntExtra("notifyID", -1);
showNotification(ID);
}
// We don't care if this service is stopped as we have already delivered our notification
return START_STICKY;
}
当我启动应用程序时,这两种方法都会执行一次,但是当通知出现时,什么都没有发生。
有没有办法测试AlarmManager 是否真的执行了PendingIntent? 我应该使用 IntentService 吗?为什么/如何?
非常感谢。
我尝试将其更改为 BroadcastReciever,如下所示:
public class NotificationBroadcastReciever extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("BROADCAST RECIEVED");
}
}
AlarmTask 位改成这样:
Intent intent = new Intent("NotificationBroadcast");
intent.putExtra(NotifyService.INTENT_NOTIFY, true);
intent.putExtra("notifyID", ID);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), ID, intent, 0);
System.out.println("date for notification: " + date.get(Calendar.DAY_OF_MONTH) + "." + date.get(Calendar.MONTH) + "." + date.get(Calendar.YEAR));
System.out.println("epoch time in milils: " + date.getTimeInMillis());
// Sets an alarm - note this alarm will be lost if the phone is turned off and on again
am.set(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), pendingIntent);
相关的清单部分如下所示:
<receiver
android:name="cz.cvut.kubispe2.jmeniny.NotificationBroadcastReciever"
android:exported="false">
<intent-filter>
<action android:name="NotificationBroadcast" />
</intent-filter>
</receiver>
我检查了要设置的日期是否等于纪元时间,但仍然没有调用 onRecieve 方法。
【问题讨论】:
-
您想在 am.set() 中添加一些延迟吗? date.getTimeInMillis() + DELAY_IN_MILLIS
-
我正在尝试在指定日期开始通知(这里的日期是一个包含通知信息的日历实例),所以我认为没有必要延迟
-
根据您的描述,服务在应用启动时启动,这似乎是现在或过去的时间,而不是未来的时间。否则为什么应用程序启动时服务会启动?添加日志消息,你的代码看起来没问题。
-
这也许是可能的。有什么办法可以重新启动服务吗?我希望全年收到更多通知,而不仅仅是一个。
-
当然。服务完成后,可以在一段时间后通过警报管理器安排新的 pendingIntent,然后自行关闭。
标签: android service alarmmanager