1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          【Android】Broadcasts詳解

          來源:互聯網轉載 時間:2024-01-29 08:05:32

          Android應用程序可以發送廣播,也可以接收Android系統或者其它應用發出的廣播,這跟發布-訂閱設計模式很相似。當一些受到關心的事件發生后,廣播會被自動發送。舉例來說,當一些系統事件(如開機,設備開始充電等)發生,Android系統會發送廣播。應用程序也可以發送自定義的廣播,比如當某個應用關注的事件(如數據更新等)發生后可以發送廣播提醒它。

          系統廣播

          當一系列系統事件發生的時候,系統會自動發送廣播,比如飛行模式的切換。系統廣播會發送給所有注冊監聽廣播的應用。

          廣播消息封裝在一個Intent對象中,其中的action屬性標識的事件的類型(比如android.intent.action.AIRPLANE_MODE),可能在intent的附件字段還包含了附加的信息。比如,用于表示飛行模式的intent包含一個附加的布爾字段來表示飛行模式的狀態是開啟還是關閉。

          如果想要具體了解如何如何讀取一個intent并且獲取附加字段,參閱Intents and Intent Filters

          參閱Android SDK中的BROADCAST_ACTIONS.TXT來了解所有系統廣播的action。每一個系統廣播都有一個常量與其綁定。比如,常量ACTION_AIRPLANE_MODE_CHANGED表示android.intent.action.AIRPLANE_MODE。每一個廣播的action的文檔都在與其關聯的常量域中。

          系統廣播的變化

          Android 7.0或更高版本不再發送下列系統廣播,這項優化會影響所有的應用程序,而不只是那些針對Android 7.0開發的程序。

          • ACTION_NEW_PICTURE
          • ACTION_NEW_VIDEO

          針對Android 7.0(API level 24)或更新版本開發的應用必須在程序中使用 ACTION_NEW_PICTURE ACTION_NEW_VIDEO 注冊監聽下列的廣播,在程序清單中聲明不再有效。

          • CONNECTIVITY_ACTION

          接收廣播

          應用程序可以使用兩種方式接收廣播:在應用清單中定義一個廣播接收器;在程序中注冊一個廣播接收器。

          靜態廣播接收器

          要定義一個靜態廣播接收器,執行下面的步驟:

          當應用程序安裝的時候,軟件包管理器會在系統中注冊廣播接收器。之后這個廣播接收器就變成了你的應用程序中一個獨立的入口,這就意味著如果你的應用程序不在運行,系統可以啟動你的程序并傳遞廣播。

          系統會創建一個新的BroadcastReceiver組件對象來處理接收到的廣播。這個對象只在調用onReceive(Context, Intent)方法期間有效。一旦從該方法返回,系統就認為這個組件對象已經失效。

          動態廣播接收器

          要注冊一個上下文相關的動態廣播接收器,執行以下步驟:

          對進程狀態的影響

          你的廣播接收器的狀態會影響它所在的進程的狀態,轉而會影響進程被系統殺死的可能性。比如,當一個進程執行一個廣播接收器(執行onReceive()方法中的代碼),它會被當作一個前臺進程。除非內存極度匱乏,否則系統會一直讓該進程運行。

          然而,一旦從onReceive()返回,廣播接收器就不再處于激活狀態,它的宿主進程也就跟其它的普通進程具有相同的優先級。如果那個進程只擁有一個在應用清單中定義的接收器,那么當從onReceive()返回后,系統會把它當作一個低優先級的進程,當其它優先級更高的進程需要更多內存的時候,它就可能被殺掉。

          鑒于這個原因,你不應該在一個廣播接收器中啟動一個長時間在后臺運行的線程。當從onReceive()返回后,系統可能會殺掉進程來回收內存,這會結束所有運行在這個進程中的線程。為了避免這種情況,你要么調用goAsync()(如果你希望能夠長時間在后臺線程中運行廣播接收器),要么在接收器中使用JobScheduler調度一個JobService。這樣系統就直到你的進程還在繼續執行任務。參閱 Processes and Application Life Cycle來獲取更多信息。

          下面的代碼片段展示了使用goAsync()來標識進程需要更多時間來完成任務。如果你要執行的任務會造成UI阻塞(>16ms),這種方式非常有效。

          ```public class MyBroadcastReceiver extends BroadcastReceiver {    private static final String TAG = "MyBroadcastReceiver";    @Override    public void onReceive(final Context context, final Intent intent) {        final PendingResult pendingResult = goAsync();        AsyncTask<String, Integer, String> asyncTask = new AsyncTask<String, Integer, String>() {            @Override            protected String doInBackground(String... params) {                StringBuilder sb = new StringBuilder();                sb.append("Action: " + intent.getAction() + "n");                sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "n");                Log.d(TAG, log);                // Must call finish() so the BroadcastReceiver can be recycled.                pendingResult.finish();                return data;            }        };        asyncTask.execute();    }}```

          發送廣播

          Android提供了三種發送廣播的方式:

          • sendOrderedBroadcast(Intent, String)方法一次向一個receiver發送廣播。因為每個receiver輪流執行,所以receiver可以將結果向下個receiver轉發。receiver接收的順序可以通過intent-filter中的android:priority屬性控制,具有相同接收優先級的receiver的接收順序是隨機的。
          • LocalBroadcastManager.sendBroadcast方法只會向本應用中的receiver發送廣播。如果你不想在應用之間發送廣播,可以使用本地廣播。這種實現方式更加高效(無需進程間通信),并且你無須考慮由于其它應用接收你的廣播而帶來的安全問題。

          下面的代碼片段示范了如何通過創建Intent并且調用sendBroadcast(Intent)來發送廣播:

          Intent intent = new Intent();intent.setAction("com.example.broadcast.MY_NOTIFICATION");intent.putExtra("data","Notice me senpai!");sendBroadcast(intent);

          廣播消息被封裝在一個Intent對象中。intent的action屬性必須提供應用的包名并且能夠唯一地標識一個廣播事件。你可以通過調用putExtra(String, Bundle)來附加額外的xinxi。你也可以通過調用intent的setPackage(String)方法來將廣播范圍限定在某個組織的一系列應用的范圍之內。

          注意:雖然intents同時被用來發送廣播和啟動Activity,但是這些行為之間并沒有任何關聯。廣播接收器無法捕捉到用來啟動Activity的intent;同樣地,當你廣播一個intent,你也無法啟動一個Activity。

          通過權限限制廣播的收發

          權限機制可以讓你將廣播的范圍限制在一系列擁有特定權限的應用之間。你既可以限制發送發,也可以限制接收方。

          帶權限發送

          當你調用sendBroadcast(Intent, String)或者 sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)時,你可以指定一個權限參數。只有應用在應用清單中申請了那個權限,其中的receiver才能接收到廣播。比如下面的代碼發送了一個帶權限的廣播:

          sendBroadcast(new Intent("com.example.NOTIFY"),              Manifest.permission.SEND_SMS);

          要接收這個廣播,應用必須申請下面的權限:

          <uses-permission android:name="android.permission.SEND_SMS"/>

          你既可以指定一個系統中已經存在的權限,比如SEND_SMS,也可以用自定義一個權限。關于權限的詳情請參考System Permissions。

          帶權限接收

          如果你在注冊receiver的時候指定了一個權限參數,那么只有申請了相應權限的應用才能夠向你的receiver發送廣播。

          比如,假設你的receiver在應用清單中這樣定義:

          <receiver android:name=".MyBroadcastReceiver" android:permission="android.permission.SEND_SMS">    <intent-filter>        <action android:name="android.intent.action.AIRPLANE_MODE"/>    </intent-filter></receiver>

          或者在代碼中這樣定義一個上下文相關的receiver:

          IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);registerReceiver(receiver, filter, Manifest.permission.SEND_SMS, null );

          那么,如果你要向這些receiver發送廣播,發送方必須申請如下的權限:

          <uses-permission android:name="android.permission.SEND_SMS"/>

          安全性和最佳使用方案

          下面是關于發送和接收廣播的安全性考慮和最佳使用方案:

          • 如果你不需要向其它應用發送廣播,那么可以使用LocalBroadcastManager發送和接收本地廣播。本地廣播更加高效(無需進程間通信),并且你無須考慮由于其它應用接收你的廣播而帶來的安全問題。本地廣播可以在不增加系統范圍內廣播數量的前提下實現一個應用內部的發布/訂閱事件通道。
          • 如果許多應用都在應用清單中注冊接收同一個廣播,會造成系統啟動大量應用,對硬件性能和用戶體驗造成影響。為了避免這種情況,優先考慮上下文相關的廣播接收器,而不是在應用清單中定義。有時,Android系統會強制要求使用上下文相關的廣播接收器。比如CONNECTIVITY_ACTION這個廣播只會發送給上下文相關的廣播接收器。
          • 不要使用隱式intent發送敏感信息。這個信息可能會被其它任何注冊該廣播的應用監聽。有三種方法來限定廣播的接收方:
            • 發送廣播的時候你可以指定一個權限
            • 在Android 4.0或更高版本,你可以通過setPackage(String)來指定一個包名。系統會將廣播發送到匹配該包名的應用中。
            • 你可以通過LocalBroadcastManager發送本地廣播。
          • 當你注冊一個receiver后,任何應用都可以向你發送具有潛在惡意信息的廣播。有三種方式來限制廣播的發送發:
            • 注冊receiver的時候可以指定一個權限。
            • 對于在應用清單中定義的receiver,可以將android:exported屬性設為false,這樣receiver就不會接收其它應用發來的廣播。
            • 你可以通過LocalBroadcastManager僅接收本地廣播。
          • 廣播的action標志是全局的,確保action的值和其它字符串的值是在你自己的命名空間中,否則你可能會不小心與其它應用發生沖突。
          • 因為receiver的onReceive(Context, Intent)方法運行在主線程中,所以它必須能夠很快地執行并返回。如果你需要執行一個耗時的操作,要小心使用子線程或者后臺服務,因為當onReceive(Context, Intent)函數返回之后,系統隨時會殺死你的進程。要了解更多信息,參考對進程的影響小節,要執行耗時的操作,我們建議:
            • 在receiver的onReceive()中調用goAsync(),然后將BroadcastReceiver.PendingResult傳遞給后臺線程。這樣可以讓receiver在onReceive()返回之后保持活躍。但即使這樣,系統也期望你快速結束這個任務(10s以內)。它確實可以讓你把任務放到后臺線程從而不影響主線程。
            • 通過JobScheduler調度一個任務。詳情參考Intelligent Job Scheduling。
          • 不要在receiver中啟動Activity,因為這嚴重影響用戶體驗,尤其是當存在多個receiver??梢酝ㄟ^顯示一個通知來代替。

          148542.html

          標簽:broadcasts-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          ps4發售上市時間?國行PS4主機于2014年12月12日零點開啟國內預售,2015年1月11日正式發售。Ps4多少年前出的?八年前,2014年2月22日是PS4在日本發售的日子,而國行的PS4是2015年3月20日發售的。到目前為止,PS4銷量已經超過1.169億臺,足以稱得上流行硬件。PlayStation4是索尼銷售的一款固定家用游戲機,被親切地稱為 "PS4 "被游戲玩家。如序列號所示,...

          安徽界首市屬于哪個市 界首在安徽哪里?界首在哪里? 界首,安徽省縣級市,由阜陽市管理,位于安徽省西北部,又稱界溝和小上海。南接臨泉縣、阜陽,東接太和縣,西北與河南省沈丘、丹城交界。因南宋著名將軍劉琦失敗而得名??谷諔馉幤陂g,由于交通堵塞,界首沒有受到日軍的侵犯,上海、南京等城市的商人紛紛遷往界首。一度,人口急劇增加,商人聚集,貿易繁榮,因此被譽為小上海。首領歷史悠久,文化豐富。東漢時期,王莽和...

          123木頭人是男的唱的嗎?《123木頭人》的這首歌的原唱是一個女子團體“黑女孩”?!?23木頭人》是一首由徐潔兒和王亞軍作詞,徐潔兒作曲,省黑人女孩演唱的歌曲,收錄在該樂隊2006年發行的專輯《粉紅高壓電》中。后來123 Woodenhead有了男版,由歌手水煮魚演唱。黑妹的原名是黑澀谷美美,是2006年由星媒社成立的省女子歌唱團體。這個組合之前有9個成員,分別是吳映潔、黃暐婷、周宜霈、王婧喬、詹...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>