1. 程式人生 > >Android的廣播機制---16年11月8日

Android的廣播機制---16年11月8日

分為標準廣播和有序廣播 標準廣播屬於完全非同步執行的廣播,廣播發出後所有的廣播接收器幾乎都會同時接收到這條廣播資訊 輸入下圖的格式:  有序廣播則是同步執行的,同一時刻只有一條廣播接收器會接收到這條廣播資訊,級別高的廣播接收器會先接收到廣播資訊,這裡就可以進行廣播資訊的截斷 廣播接收器可以對自己感興趣的廣播進行註冊,註冊完後,我們就可以接收到註冊後的廣播 註冊廣播接收器有2種方式:在程式碼中註冊,在xml中註冊 在程式碼中註冊:
  1. import android.app.Activity;
  2. import android.content.BroadcastReceiver
    ;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.IntentFilter;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.os.Bundle;
  8. import android.widget.Toast;
  9. publicclassMainActivityextendsAppCompatActivity{
  10. privateIntentFilter intentFilter;
  11. privateNetworkChangeReceiver
    networkChangeReceiver;
  12. @Override
  13. protectedvoid onCreate(Bundle savedInstanceState){
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. intentFilter =newIntentFilter();
  17. intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
  18. networkChangeReceiver
    =newNetworkChangeReceiver();
  19. registerReceiver(networkChangeReceiver,intentFilter);
  20. }
  21. @Override
  22. protectedvoid onDestroy(){
  23. super.onDestroy();
  24. unregisterReceiver(networkChangeReceiver);
  25. }
  26. publicclassNetworkChangeReceiverextendsBroadcastReceiver{
  27. @Override
  28. publicvoid onReceive(Context context,Intent intent){
  29. Toast.makeText(context,"網路狀態已修改",Toast.LENGTH_SHORT).show();
  30. }
  31. }
  32. }
IntentFilter為過濾器,需要記錄能聽到的廣播,之後需要建立一個類繼承BroadcastReceiver類,使用過載的onReceive()來複寫當接收到廣播時的操作,最後呼叫registerReceiver(new BroadcastReceiver,new intentFilter)來進行開啟,在銷燬時,需要使用unregisterReceiver(networkChangeReceiver)new BroadcastReceiver銷燬 關於監聽網路變化:
  1. publicclassNetworkChangeReceiverextendsBroadcastReceiver{
  2. @Override
  3. publicvoid onReceive(Context context,Intent intent){
  4. ConnectivityManager connectivityManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);//該方法根據傳入的值來獲得對應的Service的Object
  5. //ConnectivityManager 管理與網路連線相關的操作用於查詢網路連線狀態
  6. NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
  7. /*Network類描述了當前網路 Mobile和Wifi的狀態。
  8. isConnected()判斷網路連線是否存在
  9. isAvailable()判斷網路連線(注:isConnected為true,不代表isAvailable為true)
  10. getDetailedState()(詳細)報告當前網路狀態
  11. getState()報告當前網路狀態
  12. getExtrInfo()報告關於網路狀態的額外資訊,由較低的網路層提供的
  13. getType()獲取當前網路的型別mobile or Wi-Fi
  14. getTypeName() 獲取當前網路的型別名 “WIFI” or “MOBILE”
  15. */
  16. Toast.makeText(context,"網路狀態已修改",Toast.LENGTH_SHORT).show();
  17. }
  18. }
在xml中註冊: 前者可以通過一個類靈活控制,或者則可以在程式啟動之前就能接收到廣播 和上面一樣,建立好相應的監聽類,但這次不能建立內部類,需要單獨建立一個類  然後在xml檔案中定義相關的廣播監聽器
  1. <application
  2. android:allowBackup="true"
  3. android:icon="@mipmap/ic_launcher"
  4. android:label="@string/app_name"
  5. android:supportsRtl="true"
  6. android:theme="@style/AppTheme">
  7. <activity android:name=".MainActivity">
  8. <intent-filter>
  9. <action android:name="android.intent.action.MAIN"/>
  10. <category android:name="android.intent.category.LAUNCHER"/>
  11. </intent-filter>
  12. </activity>
  13. <receiver android:name=".MyBroadCastReceiver">
  14. <intent-filter>
  15. <action android:name="MyBroadCast"/>
  16. </intent-filter>
  17. </receiver>
  18. </application>
自定義廣播 標準廣播: 要傳送首先要接受到接聽器,此處應用上面的:
傳送時使用Intent    :  使用sendBroadcast傳送出去即可
  1. publicclassButtonClickimplementsView.OnClickListener{
  2. @Override
  3. publicvoid onClick(View view){
  4. Intent intent=newIntent("MyBroadCast");
  5. sendBroadcast(intent);
  6. }
  7. }
由於這裡是使用Intent,我們還能傳遞一些資料過去。不要忘記了Bundle型別 驗證廣播能傳遞給其他的應用: 有序廣播: 傳送廣播命令修改為      sendOrderedBroadcast(intent,null); 呼叫  abortBroadcast();來截斷廣播
  1. <activity android:name=".MainActivity">
  2. <intent-filter android:priority="100"> //在這裡設定優先順序,用於判斷有序廣播的順序
  3. <action android:name="android.intent.action.MAIN"/>
  4. <category android:name="android.intent.category.LAUNCHER"/>
  5. </intent-filter>
  6. </activity>
解決安全性問題: 使用本地廣播的方法,對於每一個有LocalBroadcast建立的廣播,只有本應用內部進行傳遞,其他的應用是不能拿到的
  1. publicclassMain2ActivityextendsAppCompatActivity{
  2. privateIntentFilter intentFilter;
  3. privateLocalReceiver localReceiver;
  4. privateLocalBroadcastManager localBroadcastManager;
  5. privateButton button2;
  6. @Override
  7. protectedvoid onCreate(Bundle savedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main2);
  10. localBroadcastManager=LocalBroadcastManager.getInstance(this);
  11. button2=(Button)findViewById(R.id.button2);
  12. button2.setOnClickListener(newView.OnClickListener(){
  13. @Override
  14. publicvoid onClick(View view){
  15. Intent intent=newIntent("MyBroadCast");
  16. localBroadcastManager.sendBroadcast(intent);
  17. }
  18. });
  19. intentFilter=newIntentFilter();
  20. intentFilter.addAction("MyBroadCast");
  21. localReceiver=newLocalReceiver();
  22. localBroadcastManager.registerReceiver(localReceiver,intentFilter);
  23. }
  24. classLocalReceiverextendsBroadcastReceiver{
  25. @Override
  26. publicvoid onReceive(Context context,Intent intent){
  27. Toast.makeText(context

    相關推薦

    Android廣播機制---16118

    分為標準廣播和有序廣播 標準廣播屬於完全非同步執行的廣播,廣播發出後所有的廣播接收器幾乎都會同時接收到這條廣播資訊 輸入下圖的格式:  有序廣播則是同步執行的,同一時刻只有一條廣播接收器會接收到這條廣播資訊,級別高的廣播接收器會先接收到廣播資訊,這裡就可以進行廣播資

    2018118有感而發

      人最大的悲哀就在於短視吧。   當我們躺在自己的生活裡看別人的故事,我們會羨慕別人。但很多時候我們都忘了其實我們也可以活得那麼精彩。   你本可以讀書,但你沒有;你本可以跑步,但你沒有;你本可以認真努力,但你沒有。   哪裡有什麼驚天動地?哪裡有什麼永垂不朽?   不過都是平淡的生活打磨出來的石子

    工作總結 2018118

      工作總結 一.完成工作: 完成從105頁到145頁閱讀 (未能完成Chapter9閱讀) 完成書中專案編寫以及執行 瞭解MyBatis核心配置 瞭解動態SQL 瞭解MyBatis的關聯對映   二.明日計劃: 14

    2018118 陣列及其應用(二)

    以下內容僅供娛樂,歡迎隨時探討,請多指教! 2018年11月8日 1、定義一個N行N列的二位陣列,求二維陣列中的最大值和最小值。 輸出最大值和最小值以及他們的位置。 #include <stdio.h> int main() { int a[3][3]={{5,2,1

    《2018118 -容器生態分享會》

    1. 容器生態介紹 基本概念 ​ 說到容器技術,大家都想到docker,可能認為容器就是docker,docker也是容器。其實,docker僅僅是一種容器的引擎。除了docker以外,還有CoreOS的RKT,還有linux的容器技術LXC等。而docker是這些容器引

    2007118第十週任務(作業)

    題目:共有4個站進行分碼多重進接CDMA通訊,4個站的碼片序列為:   A:(-1-1-1+1+1-1+1+1)        B:(-1-1+1-1+1+1+1-1)   C:(-1+1-1+1+1+1-1-1)        D:(-1+1-1-1-1-1+1-1) 現

    CocoaPods更新2018110616:06:48

    https://gems.ruby-china.org點進去就知道了……   CocoaPods命令 更新 sudo gem install cocoa pods 檢視版本 pod --version 檢視gem源 gem sources -l 刪除gem源 gem sour

    【 OJ 】 HDOJ1032 18111516:58 [ 30 ]

    ummmm啥也不想說..... Consider the following algorithm: 1. input n 2. print n 3. if n = 1 then STOP 4. if

    【 OJ 】 HDOJ1031 18111516:11 [ 29 ]

    這題沒啥好說的....沒啥感悟,就是排序.... 已AC # include<iostream> # include<algorithm> using namespace std; struct x { double v; double index; }a[1

    【 OJ 】 HDOJ1027 18111220:16 [ 26 ]

    因為本題的題意為,給定一串序列,指定輸出第M個全排序序列 所以本題網上解題的基本上都是用的STL的全排列演算法next_permutation,簡單粗暴可以直接AC 具體思想可以參考《STL原始碼剖析》 本來想直接使用next_permutation來直接AC這題,後來還是寫了一下,

    2018128(週末作業11

    依次輸入五句話,然後將它逆序輸出 import java.util.Scanner; public class 週末課後作業11 { public static void main(String[] args) { Scanner input = new Scanner(Syste

    【 OJ 】 HDOJ1045 1812811:41 [ 39 ]

    有些事情耽誤了,所以最近沒寫程式碼,此題我開始的思路還算正常,後來跑偏了....開始拿到這題第一反應就是八皇后問題,遞迴 DFS,因為這題有X塊限制,所以我的最初思路是:先和八皇后類似先在  . 塊中放能放的,X塊可以遮擋補充的地方先不考慮,當 . 塊的最後一層放完後,開始考慮X塊

    2017114 vs類和結構的區別&哈希表&隊列集合&棧集合&函數

    b- protect htable private turn queue ole 長度 ack 類和結構的區別 類:類是引用類型在堆上分配,類的實例進行賦值只是復制了引用,都指向同一段實際對象分配的內存類有構造和析構函數類可以繼承和被繼承結構:結構是值類型在棧上分配(雖然

    20171112--1(ES的數據類型-應用數據)

    例如 bre per 小數位 運行 傳遞 concat 行為 tofixed ES標準 1引用類型 Boolean 對象是 Boolean 原始類型的引用類型。 要創建 Boolean 對象,只需要傳遞 Boolean 值作為參數:var oBooleanObject =

    deepin grub20171113折騰記錄

    tid .org grub sdn xtra www bsp phoenix deep http://blog.csdn.net/atbird0321/article/details/78158194 https://bbs.deepin.org/forum.php?mod

    20171130 C#TreeNode遞歸&郵箱驗證&新用戶窗體

    安全證書 event 數據 隨機 false 設置 tex 成功 創建 TreeNode遞歸 遞歸:自己調用自己一層一層的把數據找出來 TreeNode:可以創建多個節點 private void button1_Click(object sender, EventA

    Saving James Bond - Easy Version 原創 20171123 13:07:33

    oid nta roc bottom ++ lan was html 技術分享 06-圖2 Saving James Bond - Easy Version(25 分) This time let us consider the situation in the m

    201858筆記

    grep 字節 width RoCE system ID 字符串類型 工作 abs CentOS 7上安裝mysql # CentOS 7 安裝mysql 1. 檢測系統是否自帶安裝 mysql rpm -qa | grep mysql 2. 若已安裝,可以進行卸

    求出某一天是那一的第幾星期,比如200818

    視頻下載 全部 style 源碼 2008年 dex class ner ont 題目7: 2008年1月8日是那年中的第幾星期?(視頻下載) (全部書籍) 本章源碼 import java.util.*;public class Test { public stat

    2018111開通部落格園感想!

    為什麼開通部落格園?對啊?我也想問自己這個問題。我想,還是為了自己心中那份不安分吧。至於自己心中的那小目標,我一直在奮鬥著。。。。。,我感覺在向我招手,我在一直在努力著。歸結一點就是使自己to Strong,better Strong。 學習是一個持續的過程,由於學習知識的混亂,我認為有必要將自己的學習的知