我遇到从Alarm Manager运行服务的问题。
我正在构建一个应用程序,通知他的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方法。
答案 0 :(得分:2)
当我启动应用程序时,这两个方法都会执行一次,但是当通知出现时,没有任何反应。
_WAKEUP
警报仅保证在设备路由到BroadcastReceiver
而不是Service
时唤醒设备。只要您正在做的事情非常短(1-2毫秒),您就可以安全地在onReceive()
的{{1}}中完成这项工作。您目前在BroadcastReceiver
中所做的工作符合资格。
除此之外,使用Service
确认您的闹钟是在您认为的情况下安排的。
我应该使用IntentService吗?
这肯定是比常规adb shell dumpsys alarm
更好的选择,你在当前的实现中泄露了它。但是,Service
限制仍然存在,这就是I wrote WakefulIntentService
帮助缩小差距的原因。但是,再次,由于目前您正在做的工作有限,只需使用_WAKEUP
即可。
答案 1 :(得分:0)
尝试使用应用程序上下文。
PendingIntent pendingIntent = PendingIntent.getService(context.getApplicationContext(), ID, intent, 0);
使用android logs。然后你会看到它是否在你的控制台中运行
答案 2 :(得分:0)
似乎我终于解决了它,我使用广播接收器,并找出错误的位置 - 日历将月份参数从0改为11,而不是1-12,我认为,因为所有其他参数都是正常处理。所以我只是在5月底发出通知,而不是在今天进行测试。
无论如何,谢谢大家的帮助,非常感谢。