廣播接收者
廣播接收者
安卓系統:相當於廣播電臺:提供各種廣播事件 電話 電量 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);