我正在开发一个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);
}
答案 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));
}
}