我有一种调度程序类型的应用程序,它在早上和晚上的指定时间向用户发送通知。我使用Alarm Manager完成了这项工作。在仿真器上,就此而言,应用程序工作得很好。但是在我的设备中,我使用“高级任务杀手”应用程序来杀死正在运行的应用程序并释放设备的内存。我注意到在杀死此应用程序时,通知未在预定时间显示。这绝对是合乎逻辑的,但根本不是我想要的。我希望即使进程被终止也会在预定时间显示通知。有办法吗?
我认为一些代码可能有助于实现我的问题:
我在主要活动中有这个
public void setAlarm(){
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
am.cancel(pendingIntent);
Cursor tempcursor = db.getAlarmTime();
tempcursor.moveToFirst();
int hour = tempcursor.getInt(tempcursor.getColumnIndex("Hour"));
int minute = tempcursor.getInt(tempcursor.getColumnIndex("Minute"));
tempcursor.close();
db.close();
GregorianCalendar alarmtime = new GregorianCalendar();
alarmtime.set(GregorianCalendar.HOUR_OF_DAY, hour);
alarmtime.set(GregorianCalendar.MINUTE, minute);
alarmtime.set(GregorianCalendar.SECOND, 0);
alarmtime.set(GregorianCalendar.MILLISECOND, 0);
if(alarmtime.before(new GregorianCalendar()))alarmtime.add(GregorianCalendar.DAY_OF_MONTH, 1);
am.set(AlarmManager.RTC_WAKEUP, alarmtime.getTimeInMillis(), pendingIntent);
}
这在我的AlarmReceiver类中扩展了BroadcastReceiver:
public void onReceive(Context context, Intent intent) {
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Intent i = new Intent(context, Schedule_Today.class);
PendingIntent pi = PendingIntent.getActivity(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pi2 = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + AlarmManager.INTERVAL_DAY, pi2); //Setting another notification after 1 day as soon this notification broadcast is received.
CharSequence from = "Scheduler_3";
CharSequence message = "Test Notification";
notification = new Notification(R.drawable.ic_launcher, "Attention",System.currentTimeMillis());
notification.setLatestEventInfo(context, from, message, pi);
notificationManager.notify(1, notification);
}
答案 0 :(得分:1)
我想阻止应用程序被杀或至少运行一个模块,可以在所需的时间广播警报管理器,以便用户收到通知
这不是严格可行的,除非在您自己的ROM mod中制作自己的Android版本。
在Android 2.1及更早版本中,第三方任务管理器(如“高级任务杀手”)具有“强制停止”应用程序的能力。在Android 2.2及更高版本中,该功能是为操作系统本身保留的,用户可以通过设置中应用程序列表中应用程序屏幕上的“强制停止”按钮使用该功能。
当应用程序“强制停止”时,除其他外,所有计划的警报都将被删除。此外,在Android 3.1+上,该应用程序的任何内容都不会再次运行,直到用户手动启动您的某个活动(或其他人手动运行您的某个组件)。
欢迎您编写两个应用程序,一个是主应用程序,另一个是确保如果第一个应用程序似乎已被强制停止,则会重新安排警报。但是,没有什么可以阻止用户强制停止这些应用程序。
另外,请记住,如果用户激活了“STAMINA模式”,某些设备(如SONY Xperia Z)会阻止_WAKEUP
警报。有关详情,请参阅this blog post。
因此,我建议您重新设计应用程序,以考虑到您的警报根本无法运行,更不用说您预期的时间了。