第一行代码Android第五章(广播机制,接收系统广播,发送自定义广播,使用本地广播,实践:实现强制下线)

本文深入探讨了Android的广播机制,包括标准广播和有序广播的特性。介绍了动态和静态注册接收系统广播,如监听网络变化和实现开机启动。详细讲解了如何发送自定义广播,并探讨了有序广播的顺序控制与广播截断。此外,还讨论了使用本地广播以提升安全性,并给出实现强制下线功能的实践案例。
摘要由CSDN通过智能技术生成

第五章 全局大喇叭——详解广播机制
5.1 广播机制简介
        Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。
        Android提供了一套完整的API,允许应用西横须自由地发送和接收广播。
        发送广播可以使用Intent,接收广播需要一个广播接收器。
广播的类型:1)标准广播 2)有序广播
        1)标准广播:一种完全异步执行的广播,所有广播接收器几乎在同一时刻接收到这条广播。
        2)有序广播:同步执行的广播,广播发出后同一时刻只有一个广播接收器能接收到,这一个广播接收器中的逻辑执行完毕后,广播才会继续传递。

5.2 接收系统广播
        Android内置了很多系统级别的广播,我们可以在应用程序中通过坚挺这些广播来得到各种系统的状态信息。比如手机开机完成后会发出一条广播,电池的电量发生变化会发出一条广播。
5.2.1 动态注册监听网络变化
        广播接收器可以自由的对自己感兴趣的广播进行注册,这样当有响应的广播发出时,广播接收器就能够收到该广播,并在内部处理相应的逻辑。
        注册广播一般有两种方式:在代码中注册(动态注册)和在AndroidManifest.xml中注册(静态注册)

//创建一个广播接收器,就是新建一个类,让他继承自Broadcast-Receiver并重写父类的onReceive方法
//当有广播来的时候,onReceive方法就会得到执行
//通过动态注册的方式编写一个能够监听网络变化的程序
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);
        intentFiler = new IntentFiler();
        //创建一个一个intentFiler并给他赋值android.net.conn.CONNECTIVITY_CHANGE的active
        //当网络发生变化时,系统发出的正式一条值为android.net.conn.CONNECTIVITY_CHANGE的action
        //广播接收器想监听什么广播,就在这里添加响应的action
        intentFiler.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerRecevier(networkChangeReceiver,intentFiler);    
//注册之后,networkChangeReceiver就会接收到值为android.net.conn.CONNECTIVITY_CHANGE的广播
    }
    @Override
    protected void onDestroy() {
        super.onDestory();
        unregisterReceiver(networkChangeReceiver);  //动态注册的广播一定要取消注册
    }
    class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceiver(Context context, Intent intent) {
            Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();
        }
    }
}
//修改MainActivity中的代码
public class MainActivity extends AppCompatActivity {
    ...
   class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceiver(Context context, Intent intent) {
            //通过getSystemService方法得到ConnectivityManager的实例,这是一个系统服务类,用于专门管理网络连接的
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            //调用它的getActiveNetworkInfo方法来得到networkInfo实例
            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
            //调用networkInfo的isAvailable方法来判断是否有网络
            if(networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();
            }
        }
    }
}
注意:这里访问系统的网络状态需要声明权限
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcasttest">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

5.2.2 静态注册实现开机启动
        动态注册的广播接收器可以自由地控制注册于注销,在灵活性方面有很大的有事,但是他也存在着一个缺点,就是必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的,静态注册可以让程序在未启动的情况下就能接收到广播。

//BootCompleteReceiver中的代码
public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceiver(Context context,Intent intent) {
        Toast.makeText(context,"nihao",Toast.LENGTH_SHORT).show();
    }
}
//注意:静态广播接收器一定要在AndroidManifest.xml文件中注册才可以使用
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="c
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,我们可以通过发送自定义广播实现强制下线功能。具体实现步骤如下: 1. 创建一个自定义广播 可以在应用程序中创建一个自定义广播,例如: ``` public static final String FORCE_OFFLINE_ACTION = "com.example.broadcasttest.FORCE_OFFLINE"; ``` 2. 在需要实现强制下线的地方发送广播 可以在需要实现强制下线的地方发送广播,例如: ``` Intent intent = new Intent(FORCE_OFFLINE_ACTION); sendBroadcast(intent); ``` 3. 在应用程序的Manifest文件中注册广播接收器 可以在应用程序的Manifest文件中注册广播接收器,例如: ``` <receiver android:name=".ForceOfflineReceiver"> <intent-filter> <action android:name="com.example.broadcasttest.FORCE_OFFLINE" /> </intent-filter> </receiver> ``` 4. 实现广播接收实现一个广播接收器,当接收强制下线广播时,关闭所有Activity并重新启动登录界面,例如: ``` public class ForceOfflineReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Warning"); builder.setMessage("You are forced to be offline. Please try to login again."); builder.setCancelable(false); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCollector.finishAll(); // 关闭所有Activity Intent intent = new Intent(context, LoginActivity.class); context.startActivity(intent); // 重新启动登录界面 } }); builder.show(); } } ``` 这样,当发送强制下线广播时,所有的Activity都会被关闭,并且重新启动登录界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值