为什么自己写的程序被一些下手较狠的进程管理器(如360优化大师的一键清理)杀死后,其中的广播就接收不到广播了?
曾做了一个实验:
假设有程序为A,B和C。A使用AlarmManager定时发送广播并接收广播,B为手动发送广播,C为接收广播。其中Intent的Action都为"com.yehe.mei.off.action.TIME_OUT",A、C的广播接收器都为静态注册,并过虑"com.yehe.mei.off.action.TIME_OUT" Action。
1、当A和C同时运行时,A定时发送的广播,A与C都能接收到;当用360杀死C后,A能接收到A定时发送的广播,而C接收不到。
2、当A和C同时运行时,A设定好定时发送广播后,用360将A杀死,C继续运行,时间到后C并没有接收到AlarmManager发送过来的A设定的Intent。
3、杀死A,当B和C同时运行时,通过B手动发送广播,C能接收到B发送过来的广播;当用360杀死C后,通过B手动发送广播,C便不能接收到B发送过来的广播了。
综上述,足以证明360在杀死程序进程后,程序中的广播接收器和通过AlarmManager设置的定时发送Intent功能都全部失效!
可是为什么系统自带的闹钟,用360怎么杀闹钟都能准时闹呢?如何才能实现和系统闹钟一样的强大,小强一样的杀不死?在下正在写一个定时任务的应用,希望大家帮帮忙,谢谢!
在具有root权限的进程管理器清理后,便相当于系统中的强制停止了,广播接收器等自然都不能使用了。为了最大可能地防止被这类有root权限的进程管理器杀掉,可以在程序退出的时候杀掉自己的进程,这样自己的广播接收器还是可以使用的,但那些进程管理器就找不到我们的进程了,因为已经被我们自己杀死了。但是在广播接收器收到广播后,我们的应用里程就会再被创建,因此在处理完广播后要再次杀死我们自己的进程。
当被结束进程之后,广播接收器有没有被重新注册并工作呢?
推荐通过任务管理器查看一下创建广播接收器的应用是否处于正在运行的状态
如果不在了,推荐写个服务,然后由服务来托管广播
你使用的setRepeating么?setRepeating是重复不断的发送广播
还有就是2.3以上的系统会自己重启process,以下的不会
试试这个
Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction("repeating");
PendingIntent sender=PendingIntent
.getBroadcast(Main.this, 0, intent, 0);
//开始时间
long firstime=SystemClock.elapsedRealtime();
AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
//5秒一个周期,不停的发送广播
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP
, firstime, 5*1000, sender);
http://blog.csdn.net/roserose0002/article/details/8086535
startIntent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);