四大组件之广播

去年刚毕业来北京面试的时候,被一家大公司的非安卓女士鄙视了,当时要面试我的安卓面试官请假没来,就她面我了。她当时问我怎么一开机就启动自己的APP,当时也是猜的说用广播,她问我怎么用,我也说不上来具体的,因为真心没做过也看过相关的。结果磕磕巴巴的还没说完就被打断了,看到了她不屑一顾的表情,哎,至今记忆犹新。
最近闲了开始补基础,真是。。。哎。当初要是稍微完整的看完一本书,也不至于差到那种地步,几乎一问三不知。
最近入手了好几本书,先从朋友推荐的最基础的一本《第一行代码》开始看,快速看完看后面的,这里就是给自己做些笔记。
先记录耿耿于怀好久终于知道怎么开机启动的代码。

全局广播

1:开机自启动APP

  • 所需权限:监听系统开机广播
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  • 静态注册
        <receiver android:name=".BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
        </receiver>

  • 广播接收器

查了一下,一般这里要干什么?其实没有APP神经的人家一开机就把你自己的APP直接打开显示到面前的,一般这里放一些服务之类的,像要后台接收消息、计时闹钟之类的。具体怎么写,后期学到了再补充

public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"可以干一些事情了",Toast.LENGTH_SHORT).show();
    }

2: 动态注册广播

动态注册的广播接收器可以自由的控制注册与注销(必须注销),在灵活性方面有很大优势,但有一个缺点:即必须在程序启动后才能接收到广播。如果不想这样可以使用静态广播,就是上面的开机自启动的写法。

  • 以监听网络状态为例,先获取权限
    <!--获取网络状态-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  • 动态注册代码
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;

    private void initNetworkReceiver() {
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);
    }
  • onReceive() 接收;
    class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "网络不可用", Toast.LENGTH_SHORT).show();
            }
        }
    }
  • 注销

动态注册的广播接收器一定要取消注册才行

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

本地广播

上面的动态/静态广播都是属于系统的全局广播。即发出的广播可以被任何其他程序收到,我们也可以接受到其他任何程序的广播。
而本地广播:
1.可以明确地知道正在发送的广播不会离开我们的程序,因此不用担心数据会泄露。
2.其他程序无法将广播发送到我们的程序内部,因此不用担心有安全漏洞的隐患
3.发送本地广播比起发送系统广播将会更加高效

(又是废话。。。。)
哈哈,又get到一个功能,之前写融云聊天的时候遇到过,另一方上线自己要被顶下线的,当时其实挺头疼的,不知道怎么写最好,后来是在baseactivity里写监听,当知道其他地方登陆自己被顶下线的时候就跳到登录页。
今天看书,郭霖大神建议了广播,看看,有没有更好用?因为之前自己也想过用广播的,可当时还是觉得写在base里方便点,只要都继承了baseactivty就好了。
看完了。。。。。。。嗯--------,其实差不多,都是得到消息后执行退出登录操作:关闭所有当前页之类的操作,弹出对话框然后跳到登录页。只是我可能需要回去优化下我的监听代码了,可以拎出来单独放一个地方,不放在baseactivty里试试。对了,还是记一下本地广播的写法:

  • 注册
    private IntentFilter intentFilter;
    private LocalReceiver localReceiver;
    private LocalBroadcastManager loacalBroadcastManager;

    private void initloaclReceiver() {
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.yuanli.broadcast.LOCAL_BROADCAST");
        localReceiver= new LocalReceiver ();
        loacalBroadcastManager.registerReceiver(localReceiver, intentFilter);
    }
  • 发送
Intent intent=new Intent("com.yuanli.broadcast.LOCAL_BROADCAST");
loacalBroadcastManager.sendBroadcast(intent);
  • 接受
    class LocalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
           Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show();
        }
    }
  • 注销
    @Override
    protected void onDestroy() {
        super.onDestroy();
        loacalBroadcastManager.unregisterReceiver(localReceiver);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值