介紹廣播接收者
其實BroadcastReceiver就是應用程序間的全局大喇叭,即通信的一個手段, 系統自己在很多時候都會發送廣播,比如電量低或者充足,剛啓動完,插入耳機,輸入法改變等,系統都會發送廣播,這個叫系統廣播,每個APP都會收到,如果你想讓你的應用在接收到 這個廣播的時候做一些操作,這個時候你只需要爲你的應用 註冊一個用於監視開機的BroadcastReceiver, 當然我們也可以自己發廣播,比如:接到服務端推送信息,用戶在別處登錄,然後應該強制用戶下線回到 登陸界面,並提示在別處登錄當然,這些等下都會寫一個簡單的示例幫大家瞭解廣播給我們帶來的好處
廣播接收者生命週期
靜態註冊和動態註冊的區別:假如說Activity是接受者:
動態註冊:
(1)廣播接收者會跟Activity的生命週期的結束而結束;
(2)自由的控制註冊和取消,有很大的靈活性
靜態註冊:
(1)廣播接收者不會跟隨Activity的生命週期的結束而結束,一直存在,即使應用程序關閉,也會被喚醒接受廣播
(2)全局的廣播
實現廣播接收者
首先需要創建一個java類,它繼承自廣播接收者BroadcastReceiver
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
throw new UnsupportedOperationException("Not yet implemented");
}
}
然後需要註冊一個廣播接收者
靜態註冊
在清單文件中註冊就是靜態註冊
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.highday12">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver
android:name=".MyReceiver4"
android:enabled="true"
android:exported="true"></receiver>
<receiver
android:name=".MyLocalReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.local" />
</intent-filter>
</receiver>
<activity android:name=".LocalActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".MyNotifyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.notify" />
</intent-filter>
</receiver>
<activity android:name=".Main2Activity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".MyReceiver3"
android:enabled="true"
android:exported="true" />
<receiver
android:name=".MyReceiver2"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="FM101.3" />
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="FM101.1" />
<action android:name="FM101.2" />
</intent-filter>
</receiver>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
動態註冊
通過java代碼實現註冊
//動態註冊廣播接收者
//創建一個廣播
MyReceiver myReceiver = new MyReceiver();
//添加廣播過濾器
IntentFilter intentFilter = new IntentFilter();
//添加action
intentFilter.addAction("FM101.1");
intentFilter.addAction("FM101.2");
//註冊廣播
registerReceiver(myReceiver,intentFilter);
動態註冊還需要註銷廣播
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
發送廣播
無序廣播
Intent intent = new Intent();
intent.setAction("FM101.1");
Bundle bundle = new Bundle();
bundle.putString("name","吉吉國王");
sendBroadcast(intent);
有序廣播
區別在於方法不同:sendOrderedBroadcast()發送的是有序廣播可以被攔截
Intent intent = new Intent();
intent.setAction("FM101.3");
//intent 權限名
sendOrderedBroadcast(intent,null);
攔截廣播
//判斷是有序廣播
if (isOrderedBroadcast()){
//中斷一個廣播
abortBroadcast();
}
本地廣播
Activity代碼:
public class LocalActivity extends AppCompatActivity {
private Button btnLocal;
private ImageView ivPic;
private LocalBroadcastManager broadcastManager;
private MyLocalReceiver myLocalReceiver= new MyLocalReceiver();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_local);
ivPic = (ImageView) findViewById(R.id.iv_pic);
btnLocal = (Button) findViewById(R.id.btn_local);
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.local");
broadcastManager = LocalBroadcastManager.getInstance(this);
//註冊
broadcastManager.registerReceiver(myLocalReceiver,intentFilter);
btnLocal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.local");
broadcastManager.sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
broadcastManager.unregisterReceiver(myLocalReceiver);
}
}
/**
* 本地廣播
*/
public class MyLocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("---", "onReceive: 本地廣播");
}
}