0

我在从警报管理器运行服务时遇到问题。

我正在构建一个应用程序,在他的 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 方法。

4

3 回答 3

2

当我启动应用程序时,这两种方法都会执行一次,但是当通知出现时,什么也没有发生。

_WAKEUPBroadcastReceiver只有当警报路由到 a而不是 a时,才能保证唤醒设备Service。只要您所做的工作非常短(1-2 毫秒),您就可以安全地onReceive()BroadcastReceiver. 您目前正在做的工作Service将符合条件。

除此之外,adb shell dumpsys alarm用于确认您的闹钟已安排在您认为的时间。

我应该使用 IntentService 吗?

这肯定是比常规的更好的选择Service,您在当前的实现中泄漏了常规。但是,_WAKEUP限制仍然存在,这就是我写WakefulIntentService的原因,以帮助弥合差距。不过,同样,由于您当前所做的工作有限,只需使用 aBroadcastReceiver就足够了。

于 2013-04-30T14:07:32.173 回答
0

尝试使用应用程序上下文。

PendingIntent pendingIntent = PendingIntent.getService(context.getApplicationContext(), ID, intent, 0);

并使用 android日志。然后你会看到它是否在你的控制台中运行

于 2013-04-30T13:53:07.490 回答
0

好像我终于解决了它,我使用了广播接收器,并找出了错误所在 - Calendar 将月份参数从 0 到 11,而不是我认为的 1-12,因为所有其他参数都正常处理. 所以我只是在五月底发布通知,而不是今天测试时。

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

于 2013-04-30T21:46:11.603 回答