android 通过广播唤醒被杀死的app
今天,簡單講講如何喚醒被殺死的app。
這個喚醒app主要通過廣播來喚醒。
1. 靜態廣播喚醒
廣播的exported屬性和enabled屬性
靜態的系統廣播
靜態的系統廣播,例如:開機廣播,用戶開屏廣播,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
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android AtomicBoole
- 下一篇: android studio 新建函数注