今天,简单讲讲如何唤醒被杀死的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就讲完了。

就这么简单。



android 通过广播唤醒被杀死的app相关推荐

  1. android广播唤醒app,Android APP唤醒打开其他APP

    App(a):判断是否为App(b)是否存在,不存在选择下载 存在后台状态直接唤醒 否则直接打开 App(a)部分代码 if (checkPackage("com.xxx.android&q ...

  2. Android 系统(274)---Anroid5.0以上进程保活方案(亲测可自行调起被杀死的app)

    Anroid5.0以上进程保活方案(亲测可自行调起被杀死的app) 实验了几种最后选择了2中组合 第一种 开启一像素activity保活,如果2个activity同时被杀死则此方案不可选. 第二种 发 ...

  3. Android如何降低service被杀死概率

    让app 的service常驻其实是很流氓的做法,但是需求摆在那里...  但是要清除一点:想百分百保活service在当前是无法做到的,只能降低service被杀死的概率,曾经看了多少篇网上大神的牛 ...

  4. android o 跨进程广播,[Android] Android O 广播限制

    问题 因为项目需要迁移到8.0平台,发现有一个系统应用打不开,从log发现如下描述: BroadcastQueue: Background execution not allowed: receivi ...

  5. Android后台Kill(二):ActivityManagerService与App现场恢复机制

    本篇是Android后台杀死系列的第二篇,主要讲解ActivityMangerService是如何恢复被后台杀死的进程的(基于4.3 ),在开篇 FragmentActivity及PhoneWindo ...

  6. Linux Kernel and Android 休眠与唤醒(中文版)

    Linux Kernel and Android 休眠与唤醒(中文版) 四月 18th, 2010 0 Comments/1664 hits Table of Contents 简介 国际化 版本信息 ...

  7. Android 之窗口小部件高级篇--App Widget 之 RemoteViews - 跨到对岸去

    在之前的一篇博文( Android 之窗口小部件详解--App Widge t)中,已经介绍了App Widget的基本用法和简单实例.这篇主要讲解 App Widget 的高级内容,即通过 Remo ...

  8. Android通过广播实现强制下线功能

    Android通过广播实现强制下线功能 我们首先定义一个activity集合类,在这个类里面主要添加三个方法,分别是 1.添加activity 2.删除activity 3.关闭所有activity ...

  9. Android AlarmManager广播接收器和服务

    In this tutorial, we'll be discussing AlarmManager and Broadcast Receiver and see how to trigger a B ...

最新文章

  1. vector删除第i个元素_[LeetCode] 215. 数组中的第K个最大元素
  2. Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
  3. java中属性加参数_java – 具有类型参数的注释属性
  4. C语言打印链表的中间节点的算法(附完整源码)
  5. 校园二手交易平台的开发和利用
  6. php 迭代器迭代中文时重复,3种方式解决iterator迭代器并发修改异常
  7. 利用python进行数据分析D2——ch03IPython
  8. oracle 11g(四)给oracle添加为系统服务(脚本)
  9. python大数据招聘信息_2017招聘大数据丨Python需求增速达174%,AI人才缺口超百万!...
  10. 算法-字符串 循环左移
  11. 【编译原理】第一章 引论
  12. dubbo中源码之缓存设计
  13. python是干什么的-python学来主要是干什么的
  14. 树的遍历 ALDS1_7_C:Tree Walk
  15. Android shape动态修改颜色
  16. 读书笔记:《世说新语》
  17. CleanMyMac最新发布的版本是4.10.0
  18. 34%的人会出轨。。。
  19. Microsoft编写优质无错C程序秘诀
  20. Apache文件解析漏洞

热门文章

  1. 苹果Xcode帮助文档阅读指南
  2. 编译器角度看C++复制构造函数
  3. 书评:卓有成效的ThoughtWorks程序员的45个习惯
  4. js中json的创建和解析
  5. 01XC-1: 动态规划
  6. C++ 外部函数通过指针修改类成员的值
  7. form表单的onsubmit()问题 集合
  8. iOS imageview图片压缩变形
  9. .Net连接Sybase数据库的几种方法[转]
  10. go语言学习笔记(2)命令源码文件