Android学习笔记(三)

系列文章目录

Android学习笔记(一)
Android学习笔记(二)


前言

探究 Android 的广播机制,有静态注册和动态注册。

一、动态注册广播

注册广播:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE");
receiver = new ForceOfflineReceiver();
registerReceiver(receiver, intentFilter);

动态注册的广播接收器一定要取消注册,可以在onDestroy() 方法或者 onPause() 等方法通过调用unregisterReceiver() 方法来实现。

protected void onPause() {
    //当一个活动失去栈顶位置时,就取消广播器的注册
    super.onPause();
    if(receiver != null) {
        unregisterReceiver(receiver);
        receiver = null;
    }
}

创建一个继承于BroadcastReceiver 的类,并重写 onReceive() 方法:

class ForceOfflineReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {
        //响应的逻辑
    }
}

二、静态注册

在程序未启动时就可以接收广播,但必须在 AndroidManifest.xml 中注册才可以使用。
例如开机广播:

<receiver>
	android:name=".BootCompleteReceiver"
	android:enabled="true"
	android:exported="true"
	<intent-filter>
		<action android:name="android.intent.action.BOOT_COMPLETED"/>
	</intent-filter>
</receiver>

Enabled 属性表示是否启用这个广播接收器。
Exported 属性表示是否允许这个广播接收器接收本程序以外创建的广播。

三、发送自定义广播

sendBroadcast(new Intent("com.example.broadcasttest.MY_BROADCAST");

然后在AndroidManifest.xml中修改:

<intent-filter>
	<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>

1、发送有序广播

sendBroadcast(intent) 换成 sendOrderedBroadcast(intent, null) ,在AndroidManifest.xml中添加优先级:

<intent-filter android:priority="100">
	<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>

在onReceive() 方法中添加 abortBroadcast() 方法,可以将这条广播截断。

2、发送本地广播

只有在本程序中才能传递,
在MainActivity.java中

public class MainActivity extends AppCompatActivity {

    private LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取实例
        //    private NetworkChangeReceiver networkChangeReceiver;
        Button button = findViewById(R.id.button);
        button.setOnClickListener(v -> {
            //发送自定义广播
            Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
            localBroadcastManager.sendBroadcast(intent);//发送本地广播
//                Toast.makeText(MainActivity.this, "aaaaa", Toast.LENGTH_SHORT).show();
        });
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);// 注册本地广播监听器
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }

    class LocalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
        }
    }
}

总结

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值