Android中使用AlarmManager进程被删除的解决办法

时间:2025-04-19 16:05:31

http://blog.****.net/zhouzhiwengang/article/details/13022325

Android中,AlarmManager提供了不受休眠状态的系统定时功能,其一般使用方法如下。

1、创建一个BroadcastReceiver类的子类,接收定时器事件:

  1. public class MyReceiver extends BroadcastReceiver {
  2. ......
  3. }

2、在AndroidMenifest.xml中定义上述广播事件接收类的定义:

  1. <receiver android:name=".MyReceiver">
  2. </receiver>

3、在程序中在需要时设置定时器:

  1. Intent intent = new Intent(context,MyReceiver.class);
  2. PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  3. AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
  4. alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP , SystemClock.elapsedRealtime() + ms, pendingIntent);

经过ms毫秒之后,MyReceiver会被调用,从而实现定时触发。

但是,上述实现存在一个问题:如果设置定时器的进程被杀死之后,定时器事件就不会触发。而在Android中,系统在需要时会自动终止后台进程,因此在定时过程中,进程被杀死的可能性是非常之大的,特别是在一些内存较少的设备中,基本上后台进程所设置的定时器很难被触发。

为了让定时器在进程被终止后还能触发,需要对上述实现做一个小的修改:在AndroidMefest.xml中如下定义广播接收类:

  1. <receiver android:name=".MyReceiver" android:process=":newinst" (重点)>
  2. </receiver>

1楼hudashi5天前 16:04android:process=":newinst"n你这个相当于新开了个进程。

Re: choujs5天前 16:08
回复hudashin确实是启动了一个新进程。因为原有进程被终止了,也只有启动新进程才能执行定时器代码了。
Re: hudashi4天前 12:56
回复hudashin而且静态注册的BroadcastReceiver在进程结束后,只有收到广播就启动起来,当然此时它对应的进程也被启动起来了
Re: choujs4天前 13:01
回复hudashin静态注册的BroadcastReceiver虽然会在收到广播后就启动,但是问题的关键在于:在AlarmManager应用中,如果设定定时器的进程被终止,定时器Broadcast就发不出来,BroadcastReceiver也就启动不了。因此设置BroadcastReceiver的process属性为启动新进程还是很有必要的。