3 Broadcast
3 Broadcast
动态注册监听网络变化
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetWorkChangeReceiver netWorkChangeReceiver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// intentFilter
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
netWorkChangeReceiver = new NetWorkChangeReceiver();
// registerReceiver
registerReceiver(netWorkChangeReceiver, intentFilter);
}
protected void onDestroy() {
super.onDestroy();
// unregisterReceiver
unregisterReceiver(netWorkChangeReceiver);
}
// 广播接收器
class NetWorkChangeReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
// ConnectivityManager
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isAvailable()){
Toast.makeText(context, "Network Available", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "Network unavailable", Toast.LENGTH_SHORT).show();
}
}
}
}加入权限声明
1
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
发送自定义广播
发送标准广播
自定义广播接收器
1
2
3
4
5
6
7public class MyBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "receiver in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
}
}AndroidManifest.xml修改广播接收器
1
2
3
4
5
6
7<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>MainActivity
1
2
3
4
5
6
7
8
9
10protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(v -> {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setPackage("com.example.broadcasttest"); // 一定要设置Package,否则无法启动BroadcastReceiver
sendBroadcast(intent);
});
}发送有序广播
将MainActivity修改:
1
2
3
4Intent intent = new Intent("com.example.broadcasttest.MY_ORDDER_BROADCAST0");
intent.setPackage("com.example.broadcasttest"); // 一定要设置Package,否则无法启动BroadcastReceiver
// sendBroadcast(intent);
sendOrderedBroadcast(intent, null);新建Receiver
1
2
3
4
5
6public class MyReceiver0 extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "receiver in MyReceiver0", Toast.LENGTH_SHORT).show();
}
}在Manifest.xml部署,优先级20
1
2
3
4
5<receiver android:name=".MyReceiver0">
<intent-filter android:priority="20">
<action android:name="com.example.broadcasttest.MY_ORDDER_BROADCAST0"/>
</intent-filter>
</receiver>在onReceive()添加
abortBroadcast();取消广播,下一个接收器不会触发传递数据给下一个接收器
上一个接收器:1
2
3Bundle bundle = new Bundle();
bundle.putString("first", "this is a message");
setResultExtras(bundle);获取上一个接收器存入的数据
1
2
3Bundle bundle = getResultExtras(true);
String first = bundle.getString("first");
Toast.makeText(context, "receiver in MyReceiver1\n"+first, Toast.LENGTH_SHORT).show();