Andorid四大组件(二) | BroadcastReceiver
广播接收器 不要在Onreceive中 添加过多的耗时逻辑,因为在广播接受器中不允许开启线程
动态注册(接收广播)
动态接收广播不需要在AndroidManifest 声明
创建一个类 继承自 BroadcastReceiver 并重写 onReceive
实例化上面这个类
添加IntentFilter
注册广播
注意:对于一些敏感的广播内容(网络状态等) 需要在在AndroidManifest 声明
注销广播
完整代码
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
37
38
39
40public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
NetworkReceiver receiver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//***************2*******************
receiver = new NetworkReceiver();
//***************3*******************
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
//***************4*******************
registerReceiver(receiver, intentFilter);
}
protected void onDestroy() {
super.onDestroy();
//***************5*******************
unregisterReceiver(receiver);
}
//***************1*******************
class NetworkReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(MainActivity.this, "已联网", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "网络异常", Toast.LENGTH_SHORT).show();
}
}
}
}
静态注册(接收广播)
模拟机不支持静态注册,动态注册只有在APP开启的时候才可以接收到广播,如果想不开启APP就收到广播 需要静态注册广播
静态注册广播需要在AndroidManifest中声明,并且需要声明 itentfilter中的action,表明监听哪种广播
创建一个类 继承自 BroadcastReceiver 重写 onreceive方法
在AndroidManifest中注册 上面这个广播
在注册中添加action,也就是想要监听的广播
添加一定的权限声明,根据不同的需求
全部代码(监听手机开机)
MyReceiver类
1
2
3
4
5
6
7public class MyReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "接受到广播", Toast.LENGTH_SHORT).show();
}
}MainActivity类中 不需要修改
AndroidManifest 中注册 receiver,添加权限声明
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<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.littlestone.broadcastreceiver_static">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<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/Theme.BroadcastReceiver_Static">
<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"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
发送标准广播
发送广播前,需要定义一个接收该广播的类MyReceiver,静态注册
1 | public class MyReceiver extends BroadcastReceiver { |
如何发送广播?
将上面这个静态注册的广播在AnroidMnifest注册
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
37
38<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.littlestone.broadcastreceiver_sendstandard">
<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/Theme.BroadcastReceiver_sendStandard">
<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=".MySecondReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.littlestone.broadcast.mine" />
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="com.littlestone.broadcast.mine" />
</intent-filter>
</receiver>
</application>
</manifest>定义一个要发送的广播的Intent
发送广播(sendBroadcast(intent))
全部代码
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
29public class MainActivity extends AppCompatActivity {
private Button btn_standard, btn_order;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_standard = findViewById(R.id.btn_standard);
btn_order = findViewById(R.id.btn_order);
btn_standard.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent("com.littlestone.broadcast.mine");
//标准广播
sendBroadcast(intent);
}
});
btn_order.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent("com.littlestone.broadcast.mine");
//有序广播 第二个参数为权限相关 设为null即可
sendOrderedBroadcast(intent, null);
}
});
}
}
发送有序广播
发送有序广播与标准广播大体上类似,只不过是sendorderBroadcast(intent)
既然是有序广播,就可以定义广播接收器的优先级,在intentfilter标签中 android:priority=”100” 就定义优先级的大小
代码将上述 第二个Button的点击事件处理,以及 AndroidMnifest中两个接收的注册声明
发送本地广播
发送本地广播需要在 build.gradle中添加依赖
1 | implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' |
发送本地广播
需要先实例化一个LocalBroadcastManager 通过LocalBroadcastManager.getInstance(Context context) 实例化
发送本地广播与 发送系统广播没有大的差别 只不过需要通过上面的manager来发送 而不是 Context类中来发送
接收本地广播
接收本地广播 采用动态注册的方式 进行接收广播,为什么采用动态注册 而不是静态,静态注册APP不启动时也可以收到广播,但是我们接受的是本地广播,本来就需要我们APP在启动的状态下发送,静态注册就没有意义了
实例化一个IntentFilter
为IntentFilter添加action 也就是监听什么广播
使用localBroadCastManager.registerReceiver(intentfilter)来注册广播
使用localBroadCastManager.unregisterReceiver(intentfilter)来注销广播
全部代码
1 | public class MainActivity extends AppCompatActivity { |