Broadcast使用及其生命周期

本文详细介绍了Android中BroadcastReceiver的使用,包括动态和静态注册、全局与本地广播、广播拦截以及如何实现强制下线功能。讨论了广播的生命周期,并提醒注意避免在onReceive中执行耗时任务,建议通过Service处理。最后提到了广播接收器在系统级事件响应中的作用。
摘要由CSDN通过智能技术生成

静态动态广播的使用、全局本地广播的使用、广播的拦截,要求:观察并打印生命周期方法、思考广播的使用场景
2019.6.17上午~2019.6.19下午

动态注册

动态注册的广播接收器可以自由的注册和注销,但是要在程序启动后才能收到广播。

启动时显示网络可用
在这里插入图片描述
关闭数据,改变网络状态,显示网络不可用
在这里插入图片描述

  • MainActivity
    class NetworkChangeReceiver extends BroadcastReceiver {
   

        @Override
        public void onReceive(Context context, Intent intent) {
   
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
                if (networkInfo != null && networkInfo.isAvailable()) {
   
                    Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();
                } else {
   
                    Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();   
                }
        }
    }
}

创建广播接收器:新建一个内部类继承自BroadcastReceiver,重写父类的onReceive()方法。有广播来时,onReceive()方法会执行,具体的逻辑可以在这个方法中处理。
首先通过getSystemService()方法得到了ConnectivityManager (一个系统服务类,专门用于管理网络连接)的实例。再调用NetworkInfo 的isAvailable方法,判断出当前是否有网络。

public class MainActivity extends AppCompatActivity {
   

    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //网络状态改变时系统发出的广播
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);  //注册广播接收器

    }

广播接收器想要监听的广播添加到intentFilter(过滤器)里的action中。

    @Override
    protected void onDestroy() {
   
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }

动态注册的广播接收器一定要取消注册,通过调用unregisterReceiver来实现()。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

这里查询网络状态需要在AndroidManifest.xml中声名权限

静态注册

程序未启动的情况下也可以收到广播
↓让程序接收一条开机广播

  • BootCompleteReceiver.java
public class BootCompleteReceiver extends BroadcastReceiver {
   

        @Override
        public void onReceive(Context context, Intent intent) {
   
            Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
        }
    }

新建一个类,不再使用内部类,因为要在AndroidManifest.xml中注册这个类名

  • AndroidManifest.xml
<receiver android:name=".MainActivity$BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
    </receiver>

< receiver>
所有静态注册的广播接收器都在这里进行注册。android:name指定注册哪一个广播接收器,在< intent-filter>意见过滤器 里加入想要接收的广播。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

同时声明权限

全局广播——发送自定义广播

发送标准广播

在这里插入图片描述

//标准广播
public class MyBroadcastReceiver extends BroadcastReceiver {
   
    @Override
    public void onReceive(Context context, Intent intent) {
   
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
        //abortBroadcast();   //截断
    }

新建一个类,当MyBroadcastReceiver收到自定义的广播时, 弹出“received in MyBroadcastReceiver”。

  • AndroidManifest.xml
<receiver android:name="com.sky.broadcasttestapplication.MyBroadcastReceiver">
            <intent-filter>
                <action android:name="com.sky.broadcasttestapplication.MY_BROADCAST"/>
            </intent-filter>
        </receiver>

静态注册,让MyBroadcastReceiver接收一条值为"com.sky.broadcasttestapplication.MY_BROADCAST"的广播

  • 在activity_main.xml中设置一个button
  • MainActivity.java的onCreate方法中
        mBtnstand.setOnClickListener(new View.OnClickListener() {
   
            @Override
            public void onClick(View view
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值