2 usniyo usniyo 于 2012.10.10 12:44 提问

请教一个android广播接收器的问题

为什么自己写的程序被一些下手较狠的进程管理器(如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怎么杀闹钟都能准时闹呢?如何才能实现和系统闹钟一样的强大,小强一样的杀不死?在下正在写一个定时任务的应用,希望大家帮帮忙,谢谢!

4个回答

usniyo
usniyo   2013.01.17 12:00
已采纳

在具有root权限的进程管理器清理后,便相当于系统中的强制停止了,广播接收器等自然都不能使用了。为了最大可能地防止被这类有root权限的进程管理器杀掉,可以在程序退出的时候杀掉自己的进程,这样自己的广播接收器还是可以使用的,但那些进程管理器就找不到我们的进程了,因为已经被我们自己杀死了。但是在广播接收器收到广播后,我们的应用里程就会再被创建,因此在处理完广播后要再次杀死我们自己的进程。

liangchichexin
liangchichexin   2012.10.10 13:27

当被结束进程之后,广播接收器有没有被重新注册并工作呢?
推荐通过任务管理器查看一下创建广播接收器的应用是否处于正在运行的状态

如果不在了,推荐写个服务,然后由服务来托管广播

usniyo
usniyo 感谢各位的回答!当被结束进程之后,广播接收器并没有被重新注册和工作,不知道为什么。还有我的机子是魅族M9,其中闹钟360是杀不死的。
5 年多之前 回复
liangchichexin
liangchichexin 360也会杀掉系统的闹钟。现在好像就塞班的可以防止360被杀掉
5 年多之前 回复
sasuke38
sasuke38 服务照样会被360以及很多软件杀死 最郁闷的时候就是听歌被杀掉了
5 年多之前 回复
liangchichexin
liangchichexin 再有就是看看你都启动那些服务、资源吧,这个不看代码就真不知道了。如果还有闲情逸致,新建个项目,用 Hello World 的那种,看看还占这么多的内存不
5 年多之前 回复
liangchichexin
liangchichexin 会不会存在没有退出的情况?在设置里看一下。或者在最后一个activity的onDestroy()方法中用android.os.Process.killProcess(android.os.Process.myPid());试下。
5 年多之前 回复
usniyo
usniyo 我现在就是这么做的,只是不知道为什么一个小小的程序,占内存却很大,有20多M(开过Activity后)。那如何在退出所有Activity后让程序所占的内存降低至3、4M呢?
5 年多之前 回复
niangzhi
niangzhi   2012.10.11 09:22

你使用的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);
niangzhi
niangzhi 不知道注册 time tick 这个event,process个杀掉后,会不会给系统启动起来。 我的理解是只要apk还在就能启动起来。这确实是一个挺纠结的问题,被杀掉后无法再自动启动
5 年多之前 回复
usniyo
usniyo 谢谢您的回答,我是用setRepeating,但类型用的是RTC_WAKEUP。其实,广播接收器都不工作了,能发送广播也是枉然。唉!
5 年多之前 回复
tenderfire
tenderfire   2013.09.22 17:13

http://blog.csdn.net/roserose0002/article/details/8086535

startIntent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!