Android之BroadcastReceiver(广播接受者)详解

约定不等于承诺〃 2022-09-28 11:37 303阅读 0赞

广播接受者又称全局大喇叭

  1. 分为:标准广播、有序广播。
  2. 标准广播:属于异步执行广播 ,广播发送出去以后广播接受器可以同时接收到,没有先后顺序 工作效率 无法拦截。
  3. 有序广播:属于同步执行广播 广播发出去只有一个广播接受器能接受这一条广播。
  4. 接受完毕以后广播接受器可以选择拦截或者,继续传给下一个接受器,优先级高优先收到广播 效率比较低。
  5. 广播的两种注册方式
  6. 静态:在清单文件中注册
  7. 动态:在带代码中注册,必须onDestroy时取消注册

#

1 .网络状态监听广播

MainActivity.class

  1. public class MainActivity extends BaseActivity {
  2. private IntentFilter filter;
  3. private NetWorkChangeReceiver receiver;
  4. @Override
  5. protected int bindLayout() {
  6. //加载布局文件
  7. return R.layout.activity_main;
  8. }
  9. @Override
  10. protected void initView() {
  11. //初始化控件
  12. filter = new IntentFilter();//创建意图过滤器
  13. //添加网络变化的广播 filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
  14. receiver = new NetWorkChangeReceiver();//创建广播监听器
  15. registerReceiver(receiver, filter);//注册广播
  16. }
  17. protected void onDestroy() {
  18. super.onDestroy();
  19. unregisterReceiver(receiver);//解除注册
  20. }
  21. //监听网络变化的广播
  22. class NetWorkChangeReceiver extends BroadcastReceiver {
  23. @Override
  24. public void onReceive(Context context, Intent intent) {
  25. //判断网络连接还是没有连接
  26. ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  27. NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
  28. if (networkInfo != null && networkInfo.isAvailable()) {
  29. Toast.makeText(MainActivity.this, "网络已连接", Toast.LENGTH_SHORT).show();
  30. } else {
  31. Toast.makeText(MainActivity.this, "网络断开", Toast.LENGTH_SHORT).show();
  32. }
  33. }
  34. }
  35. }

AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidbroadcastreceiver">
  3. <!-- 添加网络数据权限 -->
  4. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  5. <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
  6. <activity android:name=".MainActivity">
  7. <intent-filter>
  8. <action android:name="android.intent.action.MAIN" />
  9. <category android:name="android.intent.category.LAUNCHER" />
  10. </intent-filter>
  11. </activity>
  12. </application>
  13. </manifest>

2.标准广播

MainActivity.class

  1. public class MainActivity extends BaseActivity {
  2. /*标准广播 发送标准广播(开启另一个程序) 步骤: 1.首先创建一个新项目 2.在新项目中创建广播接受器,在onReceive方法中 public void onReceive(Context context, Intent intent) { intent = new Intent(context,MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//开启一个新栈 context.startActivity(intent); 3.在新项目清单中注册广播添加发送的广播频道 <action android:name="com.example.androidbroadcastreceiver.receiver.MyBroadcastReceiver" /> **在现在的程序中点击发送广播就能启动另一个程序了。** */
  3. @Override
  4. protected int bindLayout() {
  5. return R.layout.activity_standard_broadcast_receiver;
  6. }
  7. public void standardBR(View view) {
  8. Intent intent = new Intent("com.example.androidbroadcastreceiver.receiver.MyBroadcastReceiver");
  9. //intent.putExtra("广播", 2);//这里可以设置传值
  10. sendBroadcast(intent);
  11. }
  12. }

3.有序广播

MainActivity.class

  1. /*有序广播 发送有序广播(优先级高的 优先接收到广播) 3.设置优先级intent-filter android:priority="100" 优先级高的优先收到广播 拦截(abortBroadcast())以后广播终端 */
  2. public class MainActivity extends AppCompatActivity {
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_order_broadcast_receiver);
  7. }
  8. public void orderBR(View view) {
  9. //打开有序广播
  10. Intent intent = new Intent("com.example.androidbroadcastreceiver.receiver.MyBroadcastReceiver");
  11. intent.putExtra("广播", 3);
  12. sendOrderedBroadcast(intent, null);//发送有序广播需要两个参数1.intent 2.权限参数设置为null
  13. }
  14. }

MyBroadcastReceiver.class

  1. //广播接受器
  2. public class MyBroadcastReceiver extends BroadcastReceiver {
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5. if (intent.getIntExtra("广播", 0) == 3) {
  6. Toast.makeText(context, "发送有序广播(优先级高的 优先接收到广播)\n" +
  7. "并且终止广播禁止程序启动", Toast.LENGTH_SHORT).show();
  8. }
  9. abortBroadcast();//广播拦截,禁止向下传递
  10. }
  11. }

AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidbroadcastreceiver">
  3. <!-- 添加网络数据权限 -->
  4. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  5. <!-- 添加开机通知权限 -->
  6. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  7. <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
  8. <activity android:name=".MainActivity">
  9. <intent-filter>
  10. <action android:name="android.intent.action.MAIN" />
  11. <category android:name="android.intent.category.LAUNCHER" />
  12. </intent-filter>
  13. </activity>
  14. <receiver android:name=".receiver.MyBroadcastReceiver" android:enabled="true" android:exported="true">
  15. <!-- 设置优先级 -->
  16. <intent-filter android:priority="100">
  17. <action android:name="com.example.androidbroadcastreceiver.receiver.MyBroadcastReceiver" />
  18. </intent-filter>
  19. </receiver>
  20. </application>
  21. </manifest>

4.自定义广播

MainActivity.class

  1. /* 自定义广播 */
  2. public class MainActivity extends BaseActivity {
  3. @Override
  4. protected int bindLayout() {
  5. return R.layout.activity_custom_broadcast_receiver;
  6. }
  7. public void customBR(View view) {
  8. //打开自定义广播
  9. Intent intent = new Intent("com.example.androidbroadcastreceiver.receiver.CustomBroadcastReceiver");
  10. intent.putExtra("zdy", "自定义广播");
  11. sendBroadcast(intent);
  12. }
  13. }

CustomBroadcastReceiver.class

  1. /*自定义广播接受器 步骤: 1.创建广播接受器是必须勾选enabled、exported,否者接受不到广播 android:enabled="true" android:exported="true" 2.创建Intent i= new Intent("发送的广播"); 可以传值i.putString("标记","值"); sendBroadcast(intent); 然后接受器就能就收到广播啦! */
  2. public class CustomBroadcastReceiver extends BroadcastReceiver {
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5. Toast.makeText(context, intent.getStringExtra("zdy"), Toast.LENGTH_SHORT).show();
  6. }
  7. }

AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidbroadcastreceiver">
  3. <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
  4. <activity android:name=".MainActivity">
  5. <intent-filter>
  6. <action android:name="android.intent.action.MAIN" />
  7. <category android:name="android.intent.category.LAUNCHER" />
  8. </intent-filter>
  9. </activity>
  10. <!-- 添加自定义广播 -->
  11. <receiver android:name=".receiver.CustomBroadcastReceiver" android:enabled="true" android:exported="true">
  12. <intent-filter>
  13. <action android:name="com.example.androidbroadcastreceiver.receiver.CustomBroadcastReceiver" />
  14. </intent-filter>
  15. </receiver>
  16. </application>
  17. </manifest>

5.本地广播

LocalBroadcastReceiverActivity.class

  1. /* 本地广播 步骤: 1.首先创建LocalBroadcastManager对象管理广播、IntentFilter、LocalReceiver(广播接受器) 2.通过manager来注册、和解绑广播 3.本地广播只能在自身应用程序中使用,安全性高 */
  2. public class LocalBroadcastReceiverActivity extends AppCompatActivity {
  3. private LocalBroadcastManager manager;
  4. private IntentFilter filter;
  5. private LocalReceiver receiver;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_local_broadcast_receiver);
  10. manager = LocalBroadcastManager.getInstance(this);
  11. filter = new IntentFilter();
  12. filter.addAction("com.example.androidbroadcastreceiver.activity.LocalBroadcastReceiverActivity.LocalReceiver");
  13. receiver = new LocalReceiver();
  14. manager.registerReceiver(receiver, filter);
  15. }
  16. public void localBR(View view) {
  17. //打开本地广播 安全不能跳转到别的程序
  18. Intent intent = new Intent("com.example.androidbroadcastreceiver.activity.LocalBroadcastReceiverActivity.LocalReceiver");
  19. intent.putExtra("bd", "我是刚创建的本地广播\n" +
  20. "不能走出这个应用程序");
  21. manager.sendBroadcast(intent);
  22. }
  23. @Override
  24. protected void onDestroy() {
  25. super.onDestroy();
  26. manager.unregisterReceiver(receiver);
  27. }
  28. class LocalReceiver extends BroadcastReceiver {
  29. @Override
  30. public void onReceive(Context context, Intent intent) {
  31. Toast.makeText(context, intent.getStringExtra("bd"), Toast.LENGTH_SHORT).show();
  32. }
  33. }
  34. }
  35. End!

发表评论

表情:
评论列表 (有 0 条评论,303人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android广播BroadcastReceiver

    Android 系统里定义了各种各样的广播,如电池的使用状态,电话的接收和短信的接收,开机启动都会产生一个广播。当然用户也可以自定义自己的广播。 既然说到广播,那么必定有一个