AlarmManager如果应用程序休息1天,则不会在第二天调用

时间:2013-01-24 09:42:38

标签: android notifications broadcastreceiver alarmmanager

我正在开发一个Android应用程序,如果时间保存在数据库中,则每12小时显示一次通知。因此,每次在数据库中输入或编辑数据时,我都会取消当前的报警管理器并启动一个全新的报警管理器,这样我就不会错过一个。同样在重新启动时,我已经调用了alarmmanager。在广播接收器上,检查数据库是否有条目,如果找到,则设置通知并自动打开应用程序。

因此,当我通过手动更改日期来测试应用程序时,应用程序按预期工作。在重新启动时,应用程序也能正常工作。但是如果我让应用程序闲置近14个小时,则通知未设置,但如果我打开应用程序并暂停它,之后设置通知。

这就是我给警报管理员打电话的方式。    Intent alarmintent = new Intent(context,package.Alarm_Manager.class);

    alarmintent.putExtra("note","Notify");
    sender = PendingIntent.getBroadcast(context , 0 , alarmintent , PendingIntent.FLAG_CANCEL_CURRENT | Intent.FILL_IN_DATA);            
    alarm_manger = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    alarm_manger.cancel(sender);
    Calendar cal = Calendar.getInstance();
    long now = cal.getTimeInMillis();
    alarmintent = new Intent(context, package.Alarm_Manager.class);
    alarmintent.putExtra("note","Notification");
    sender = PendingIntent.getBroadcast(context , 0 , alarmintent , PendingIntent.FLAG_CANCEL_CURRENT | Intent.FILL_IN_DATA);            
    alarm_manger = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarm_manger.setRepeating(AlarmManager.RTC_WAKEUP, now, AlarmManager.INTERVAL_HALF_DAY, sender);

这是广播接收器

@Override
public void onReceive(Context context, Intent intent)
{
       NotificationManager manger = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
       Calendar cal = Calendar.getInstance();
       date = (int)(cal.getTimeInMillis()/1000);
       Notification notification = new Notification(R.drawable.vlcsnap_396460 , "Notify" , System.currentTimeMillis());
       PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);
       notification.setLatestEventInfo(context, "App", "Notify" , contentIntent);
       notification.flags = Notification.FLAG_INSISTENT;
       manger.notify( 0 , notification);
   }

2 个答案:

答案 0 :(得分:0)

如果设置alarm_manager.cancel(sender);

,则无需致电PendingIntent.FLAG_CANCEL_CURRENT.

致电

alarm_manger.setRepeating(AlarmManager.RTC_WAKEUP, now, AlarmManager.INTERVAL_HALF_DAY, sender);

会立即触发警报,因为当你设置警报时,现在已经过了。

我建议你使用

now + DateUtils.HOUR_IN_MILLIS / 2 

用于triggerAtMillis参数

您是否尝试过较短的时间间隔?是否被触发?

答案 1 :(得分:0)

在看过你的Alarm_Manager代码之后,我认为直接在你的BroadcastReceiver对象中执行此操作是违法的。 Quote

  

如果通过标记启动此BroadcastReceiver,则从该函数返回后该对象不再存在。

我相信除了创建一个由BroadcastReceiver通知的服务之外别无他法,并确保服务调用setLatestEventInfo()自身(this)作为上下文。

当您的应用程序运行时,异步广播失败的原因可能是,当您的应用程序未运行时,提供给BroadcastReceiver的Context仅在调用BroadcastReceiver期间存在。因此,仅在您的BroadcastReceiver与临时上下文一起死亡后运行的Notification服务缺少有效的上下文。

当您的应用运行时,广播可能会将您的活动或应用程序对象作为上下文附带,并且当通知管理器运行时,这仍然是虚假的。

希望这有帮助。

更新:`IntentService``会做。你不需要全职服务。

更新2:一些代码段。

<service android:name=".MyIntentService" android:label="@string/my_intent_service_name" />

public final class MyIntentService extends IntentService {
    public MyIntentService() {
    super("service name");
    // set any properties you need
    }
    @Override
    public void onCreate() {
        super.onCreate();
        // do init, e.g. get reference to notification service
    }
    @Override
    protected void onHandleIntent(Intent intent) {
    // handle the intent
        // ...especially:
        notification.setLatestEventInfo(this, "App", "Notify" , contentIntent);
        // ...
    }
}

public final class MyAlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        context.startService(new Intent(context, MyIntentService.class));
    }
}