去年刚毕业来北京面试的时候,被一家大公司的非安卓女士鄙视了,当时要面试我的安卓面试官请假没来,就她面我了。她当时问我怎么一开机就启动自己的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);
}