Android服务无法从AlarmManager运行

时间:2013-04-30 13:40:30

标签: android service alarmmanager

我遇到从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方法。

3 个答案:

答案 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月底发出通知,而不是在今天进行测试。

无论如何,谢谢大家的帮助,非常感谢。