日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 通过广播唤醒被杀死的app 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.



今天,簡單講講如何喚醒被殺死的app。


這個喚醒app主要通過廣播來喚醒。


1. 靜態廣播喚醒

廣播的exported屬性和enabled屬性

  • exported默認為true表示這個廣播可以接收來自其他app發送的廣播,只要條件滿足,exported設置成false表示只能是這個app內發送的廣播才能接收,即使是receiver的進程和發送廣播的進程不是同一個,但是只要都是屬于一個app的就可以正常接收,有時候會遇到發送者和接收者不在一個進程,廣播沒辦法正常接收,這是因為receiver所在的進程是死的,如果通過某種方式把receiver所在的進程喚醒,那么即使exported為false也能正常接收
  • 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。