1. 程式人生 > >廣播接收者

廣播接收者

廣播接收者

安卓系統:相當於廣播電臺:提供各種廣播事件 電話 電量 sd卡狀態等等

廣播接收者:相當於一臺收音機,我們可以接收到系統廣播事件執行相應的程式碼.即使應用程式程序關閉 也可以接到廣播

用法:

新建一個廣播接收者

new->other->Broadcast Receiver

也可以自己新建一個class 繼承BroadcastReceiver 重寫 onReceiver方法

建立好的接收者回有一條拋異常的程式碼 刪掉就好

throw new UnsupportedOperationException("Not yet implement"
);

系統廣播接收方法:

我們試著 監聽系統的廣播事件,系統啟動的廣播,實現應用開機啟動

2.去清單檔案配置

配置是必須的,有個例外最後會提到.

 <receiver
           <!--接收者的名字-->
            android:name=".MyReceiver1"
            <!--是否可以new它的例項-->
            android:enabled="true"
            <!--4.4後特有 其他應用是否可以訪問-->
            android:exported="true">
            <intent-filter
>
<action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>

其中action後面就是要匹配的系統啟動時的廣播

需要注意的是這裡需要一個加一個許可權

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

回到我們自己建的廣播接收者裡面 在onReceiver方法裡寫上啟動頁面的程式碼

 Intent intent1 = new Intent(context,MainActivity.class);
       //由於這樣開啟頁面沒有任務棧,我們需要自己建一個
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent1);

開機啟動功能完成

自定義廣播

概念:自定義廣播分為無序和有序

  • 無序廣播:這種廣播不可被終止,內容不可被改變

自定義傳送無序廣播方法:

我們通過一個按鈕來發廣播

 public void click(View view) {
        Intent intent = new Intent();
   //通過putExtra攜帶了一個數據 鍵是data值是 電視節目播出了
        intent.putExtra("data","電視節目播出了");
        intent.setAction("com.aaaaa.intent");
        sendBroadcast(intent);
        }

我們在清單檔案配置稍微有點不同,這裡是我們自己定義廣播事件

<receiver
            android:name=".MyReceiver1"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
            <!--後面變成了自己定義的廣播事件-->
                <action android:name="com.aaaaa.intent" />
            </intent-filter>
        </receiver>

接廣播

package p5.itheima.com.app2;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver1 extends BroadcastReceiver {
    public MyReceiver1() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
      /**
      *廣播攜帶資料 通過getStringExtra接收
      */
        String action = intent.getStringExtra("data");
        Toast.makeText(context, action, Toast.LENGTH_SHORT).show();
    }
}

有序廣播

開發者可以自己定義的另一種廣播,這種廣播的特點是一級一級傳遞可以被一個程式終止 修改資料 也可以通過配置引數監視資料最後傳播的狀態

 public void click(View view) {
        Intent intent = new Intent();
        intent.setAction("com.itheima.intent");
        sendOrderedBroadcast(intent,null,new FinalReceiver(),new Handler(),1,"凌晨三點半在屋頂一起看日出",null);
        }

sendOrderedBroadcast引數詳解:

  • 第一個引數:意圖,將intent傳入就好
  • 第二個引數:接收許可權
  • 第三個引數:廣播接收者型別,可以將這廣播個視為最終廣播.可以檢查資料最後傳遞的狀態.
  • 第四個引數:Handler 例項.自己定義一個例項即可
  • 第五個引數:int型別的初始碼,一個標識,自己隨便定義一個int型別的值
  • 第六個引數:通過String攜帶的資料.這是有序廣播特有的
  • 第七個引數:Bundle,底層一個map,表示是否接收一個額外的資料

有序廣播的層級接受方法:

先建好Receive,注意在清單檔案裡配置

<intent-filter
    android:prioity="100"           
    >
    <action android:name="com.itheima.intent"></action>
</intent-filter>

這個action是 上面寫好的action.要保持一致

android:prioity=”100”是優先順序屬性 範圍是+1000到-1000可以決定接受廣播的優先度

在新建行的Receive裡的onReceive方法裡寫接收程式碼

public void onReceive(Context context,Intent intent){
  //這裡我們可以取出傳遞來的資料
    String data = getResultData();
  //通過Toast彈一下證明我們取到了資料
  Toast,makeText(context,data,Toast.LENGTH_SHORT).show();
}

同理我們可以寫出很多這樣的接受方法 只是修改優先順序便可以決定接受順序.我們可以在接受時修改資料 讓後面接收到的資料不同

public void onReceive(Context context,Intent intent){
    String data = getResultData();
  Toast,makeText(context,data,Toast.LENGTH_SHORT).show();
  //通過一個方法修改資料
  setResultData("凌晨三點半在家睡覺");
}

我們也可以終止資料傳遞

public void onReceive(Context context,Intent intent){
    String data = getResultData();
  //通過這個方法把傳遞終止
 abortBroadcast();

再建立一個最終的廣播接收者 也就是前面引數三定義的FinalReceiver,把它創建出來

//拿到最後的資料
String data = getResultData();

最終廣播接收者無需配置優先順序!它具有特權,即使資料傳遞被終止它一樣可以拿到

特殊廣播接收者

概念:當某個廣播事件特別頻繁時.我們就不能按常規方式去進行接收.比如螢幕關閉喚醒事件

android.intent.action.SCREEN_OFF

android.intent.action.SCREEN_ON

這時候我們需要用Context.register.Receiver()方法進行動態註冊

register.Receiver()兩個引數詳解

  • 要註冊的receiver的例項
ScreenREceiver screenreceiver = new ScreenREceiver();
  • 意圖過濾器的例項
 IntenFilte filter = new IntenFilter();

在意圖過濾器裡面新增我們正常配置需要的action

filter.addAction("android.intent.action.SCREEN_ON");
filter.addAction("android.intent.action.SCREEN_OFF");

我們動態註冊的receiver需要手動取消 當我們不需要它的時候需要執行這個方法.引數裡寫剛剛註冊的例項.

unregisterREceiver(screenreceiver);