进程被终止时不会显示计划通知

时间:2013-06-19 12:57:36

标签: android alarmmanager android-notifications

我有一种调度程序类型的应用程序,它在早上和晚上的指定时间向用户发送通知。我使用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);
}

1 个答案:

答案 0 :(得分:1)

  

我想阻止应用程序被杀或至少运行一个模块,可以在所需的时间广播警报管理器,以便用户收到通知

这不是严格可行的,除非在您自己的ROM mod中制作自己的Android版本。

在Android 2.1及更早版本中,第三方任务管理器(如“高级任务杀手”)具有“强制停止”应用程序的能力。在Android 2.2及更高版本中,该功能是为操作系统本身保留的,用户可以通过设置中应用程序列表中应用程序屏幕上的“强制停止”按钮使用该功能。

当应用程序“强制停止”时,除其他外,所有计划的警报都将被删除。此外,在Android 3.1+上,该应用程序的任何内容都不会再次运行,直到用户手动启动您的某个活动(或其他人手动运行您的某个组件)。

欢迎您编写两个应用程序,一个是主应用程序,另一个是确保如果第一个应用程序似乎已被强制停止,则会重新安排警报。但是,没有什么可以阻止用户强制停止这些应用程序

另外,请记住,如果用户激活了“STAMINA模式”,某些设备(如SONY Xperia Z)会阻止_WAKEUP警报。有关详情,请参阅this blog post

因此,我建议您重新设计应用程序,以考虑到您的警报根本无法运行,更不用说您预期的时间了。

相关问题