当前位置: 首页 > article >正文

android 通过广播唤醒被杀死的app



今天,简单讲讲如何唤醒被杀死的app。


这个唤醒app主要通过广播来唤醒。


1. 静态广播唤醒

广播的exported属性和enabled属性

  1. exported默认为true表示这个广播可以接收来自其他app发送的广播,只要条件满足,exported设置成false表示只能是这个app内发送的广播才能接收,即使是receiver的进程和发送广播的进程不是同一个,但是只要都是属于一个app的就可以正常接收,有时候会遇到发送者和接收者不在一个进程,广播没办法正常接收,这是因为receiver所在的进程是死的,如果通过某种方式把receiver所在的进程唤醒,那么即使exported为false也能正常接收
  2. enabled为true表示广播可用,为false表示禁用广播,禁用后广播将无法接收


静态的系统广播

静态的系统广播,例如:开机广播,用户开屏广播,USB插入和拔出广播等这类广播在app运行期间可以用静态注册的广播正常接收,但是在app被杀死后就无法收到了,android系统做了屏蔽,把被杀死的app的系统静态广播都过滤了,所以想让app被杀死后仍然通过静态注册的广播接收系统广播是做不到的


自定义广播

我们一般发广播都是局限在app内部,所以通常都是这么发的:

Intent intent = new Intent();
intent.setAction("my.broadcast.test");
sendBroadcast(intent);


或者这么发:

Intent intent = new Intent(context, TestBroadcastReceiver.class);
sendBroadcast(intent);


上面这两种广播的发送方式在app被杀死后都无法收到广播

但是采用下面这种方式发送广播即使app被杀死后,静态广播也能正常收到:
发送广播方的app,包名:com.syncpush.demo

Intent intent = new Intent();Context c = null;try {c = createPackageContext("com.example.broadcasttest", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}
//            intent.setPackage(getPackageName());
//            intent.setComponent(pkgName, className);
//            intent.setComponent(pkgNameContext, className);intent.setClassName(c, "com.example.broadcasttest.TestBroadcastReceiver");
//            intent.setClassName("com.example.broadcasttest", "com.example.broadcasttest.TestBroadcastReceiver");intent.setAction("my.broadcast.test");intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);sendBroadcast(intent);

ntent.setClassName(“com.example.broadcasttest”, “com.example.broadcasttest.TestBroadcastReceiver”)声明接收的广播或者用intent.setClassName(c, “com.example.broadcasttest.TestBroadcastReceiver”),但是这个Context是接收广播方app的Context,所以通过createPackageContext(“com.example.broadcasttest”, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY)根据包名来获取到app的Context

接收广播方的app,包名com.example.broadcasttest


其实主要的耗还是Intent的广播添加了FLAG_EXCLUDE_STOPPED_PACKAGES标志,这样,手机就会把广播发送给停止运行的app。这里还可以简单写成这样的代码:

Intentintent = new Intent("com.baidu.tieba.action.INVOKE"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//3.1以后的版本直接设置Intent.FLAG_INCLUDE_STOPPED_PACKAGES的value:32if (android.os.Build.VERSION.SDK_INT>= 12) {intent.setFlags(32);}intent.putExtra("type",
"frs");intent.putExtra("fname",
"李毅");activity.sendBroadcast(intent);


如果你的项目依赖的Android SDK是3.1以下版本,是需要判断的。android 3.0之前是没有FLAG_EXCLUDE_STOPPED_PACKAGES标志。

public class TestBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();Toast.makeText(context, "action:" + action, Toast.LENGTH_LONG).show();Log.i("TestBroadcastReceiver", "action:" + action);}
}// 配置文件
<receiver android:name="com.example.broadcasttest.TestBroadcastReceiver"android:exported="true"android:enabled="true"><intent-filter><action android:name="android.intent.action.USER_PRESENT" /> <!-- 手机开屏广播 --></intent-filter><intent-filter><action android:name="my.broadcast.test" /> <!-- 自定义广播 --></intent-filter></receiver>


接收放广播的配置要把exported设置成true,否则就无法收到app以外的广播发送,只能收到app内部的广播发送


广播唤醒的缺陷

以上通过广播唤醒在一些手机上可以正常唤醒app,例如小米3;但是在魅族手机上就没办法唤醒了,需要到安全中心把app的自启动权限开启后才能正常唤醒,由此可见,一些手机厂商可能对于静态广播的接收做了一些优化导致静态广播还是没办法被接收,所以会唤醒失败

关于intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)

这个网上说是设置了就能保证即使app被杀死后,也能正常接收广播,但是我在小米手机上测了下,没有用,即使没设置,但是采用intent.setClassName()后,app杀死后也能正常接收广播,后来怀疑是不是默认就是Intent.FLAG_INCLUDE_STOPPED_PACKAGES,于是就intent.setFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES),意思是app被杀死后就不接收广播,但是广播照样能正常接收,所以跟intent.setFlags()貌似没关系,但是小米手机系统是定制的,我不敢保证他们是不是对这方面做了修改,目前没有在原生的android系统上试过intent.setFlags()的有效性


这些是我把网上的资料整理的,大家自己也可以去查找一下。其实还可以通过Service唤醒app。


android 通过广播唤醒被杀死的app就讲完了。


就这么简单。


http://www.lryc.cn/news/2419475.html

相关文章:

  • 工具之《activemq管理界面介绍》
  • 手把手教你用Python爬虫入门
  • excel文件损坏修复绝招_修复数据工具大盘点,让你快速掌握电脑数据恢复的秘密武器...
  • 13.【openCV_imread()函数详解】
  • 电子工程师-单片机的开发过程1
  • Qt学习12:常用Layout布局方式总结
  • 二进制文件、文本文件
  • linux tar命令解析(压缩解压)(tar指令)(十分之坑,千万不要在windows上解压带有软链接的压缩文件,会把软链接搞没了!软链接丢失、软链接失效)
  • 串联/并联谐振电路及其应用
  • 前端必知:29,改变鼠标手势及鼠标手势的应用
  • 计算机组成原理 01:计算机的发展历程
  • oracle instant-client下载与安装sqlplus
  • 欢迎光临
  • 每日一点硬件小知识—PS/2接口
  • Linux系统安装教程(虚拟机版)
  • 【C++入门必看】C++从0到1入门编程
  • 彻底解决小米随身WIFI(MiWIFI)安装失败,无法使用无线网卡功能的方法
  • 适合小白学的基础知识—SSTI漏洞学习
  • 终端准入安全之五种准入规则简介
  • Dynamics 365配置ADFS
  • 美化必备,#ffffffff语句的解析和透明度数值参照表
  • Mainframe的存储管理系统和架构
  • Flow、SharedFlow、StateFlow 傻傻分不清楚
  • 【JavaScript】一文了解定时器的使用
  • Windows7系统explorer.exe文件问题
  • 约瑟夫环问题(队列,链表实现)- c++
  • 系统编程之文件IO(四)——初级IO(open、close、write、lseek)
  • JS中clientWidth offsetWidth innerWidth scrollWidth等区分
  • 经纬度有哪些格式
  • WAV文件格式详解