一、BroadcastReceiver概述
BroadcastReceiver是用来接收系统和应用的广播的一种组件
二、BroadcastReceiver使用方式
1、静态注册
静态注册是常驻型的,即当应用关闭,自定义BroadcastReceiver也会被系统调用
-新建自定义BroadcastReceiver继承自BroadcastReceiver
-重写onReceive()方法
-在AndroidManifest.xml中注册次BroadcastReceiver,并设置接收广播的action name,通常采用自定义BroadcastReceiver包名
-创建Intent对象,并通过setAction()设置与BroadcastReceiver匹配的action name
-sendBroadcast(intent)
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.example.lenovo.broadcastreceiver.TEST"/>
</intent-filter>
</receiver>
</application>
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("msg" , intent.getStringExtra("msg"));
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void doClick(View v){
//以下两种写法均可
Intent intent = new Intent("com.example.lenovo.broadcastreceiver.TEST");
//intent.setAction("com.example.lenovo.broadcastreceiver.TEST");
intent.putExtra("msg" , "已接收广播");
sendBroadcast(intent);
}
}
-新建自定义BroadcastReceiver继承自BroadcastReceiver
-重写onReceive()方法
-创建IntentFilter对象,通常在Activity或Service中注册
-通过registerReceiver()注册,参数分别为自定义BroadcastReceiver对象与IntentFilter对象
-创建Intent对象,并通过setAction()设置与BroadcastReceiver匹配的action name
-sendBroadcast(intent)
-通过unregisterReceiver()取消注册
public class MainActivity extends AppCompatActivity {
private MyReceiver myReceiver = new MyReceiver();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.lenovo.broadcastreceiver.TEST");
registerReceiver(myReceiver , intentFilter);
}
public void doClick(View v){
Intent intent = new Intent("com.example.lenovo.broadcastreceiver.TEST");
intent.putExtra("msg" , "已接收广播");
sendBroadcast(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
三、BroadcastReceiver种类
1、普通广播
-同级别接收先后顺序随机
-Receiver不能截断广播继续传播也不能处理广播
-同级别动态注册高于静态注册
2、有序广播
-同级别接收先后顺序随机
-同级别动态注册高于静态注册
-能截断广播继续传播,高级别BroadcasstReceiver收到广播后,可以决定是否截断广播
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver">
<intent-filter android:priority="200">
<action android:name="com.example.lenovo.broadcastreceiver.TEST"/>
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver2">
<intent-filter android:priority="100">
<action android:name="com.example.lenovo.broadcastreceiver.TEST"/>
</intent-filter>
</receiver>
</application>
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("msg" , "MyReceiver: " + intent.getStringExtra("msg"));
//截断广播
abortBroadcast();
}
}
public class MyReceiver2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.i("msg" , "MyReceiver2: " + intent.getStringExtra("msg"));
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void doClick(View v){
Intent intent = new Intent("com.example.lenovo.broadcastreceiver.TEST");
intent.putExtra("msg" , "RECEIVER已接收广播");
sendOrderedBroadcast(intent , null);
}
}
-Receiver可以处理广播
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("msg" , intent.getStringExtra("msg"));
Bundle bundle = new Bundle();
bundle.putString("msg" , "@MyReceiver: " + intent.getStringExtra("msg"));
setResultExtras(bundle);
}
}
public class MyReceiver2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.i("msg" , getResultExtras(true).getString("msg"));
}
}