复习Android——广播
广播简介
在Android中每个应用都可以对任意的广播进行注册,这样就可以接受到指定的广播内容。
Android提供了完整的API,允许应用程序*的发送和接受广播。
Android中的广播主要分为以下两种:
-
标准广播
标准广播是一种完全异步执行的广播,在广播发出之后,所有的BroadcastReceiver几乎会在同一时间收到这条广播信息,但是此种广播也就无法被拦截。
-
有序广播
有序广播是一种同步执行的广播,在广播发出之后,在同一时刻只有一个BroadcastReceiver可以收到此广播信息;
当前的BroadcastReceiver中的逻辑执行完成之后,可以选择继续传递该广播信息也可以选择截断传递;
在有序广播中BroadcastReceiver是有先后顺序的,优先级大的先接受到广播信息;
接受系统广播
BroadcastReceiver的注册方式一般有两种,一种是在AndroidManifest.xml中注册为静态注册,另一种是在代码中注册为动态注册。
动态注册监听时间变化
创建广播接收器类一般为内部私有类,并重写相关方法:
private class TimeChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(FirstActivity.this, "时间发生变化", Toast.LENGTH_SHORT).show();
}
}
在需要用到地方注册:
//获取系统广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.TIME_TICK");
timeChangeReceiver = new TimeChangeReceiver();
registerReceiver(timeChangeReceiver, intentFilter);
在Activity被销毁或者跳转时需要解注册广播:
@Override
protected void onDestroy() {
super.onDestroy();
//解注册广播
unregisterReceiver(timeChangeReceiver);
}
需要监听什么广播就需要声明相应的IntentFilter。
静态注册实现开机启动
动态注册是写在代码里的,这就意味着广播的注册必须要在程序启动之后进行。
在Android8之后所有的隐式广播都不允许静态注册接收,隐式广播是指没有具体指定要发给哪个应用的广播。
声明开机启动广播接收器:
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "手机启动完毕", Toast.LENGTH_LONG).show();
}
}
在Manifest文件中声明权限:
<!--声明接收开机广播的权限-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
在Manifest文件中声明要接收的广播:
<!--注册手机启动广播接收-->
<receiver android:name=".BroadcastReceivers.BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Android系统为了保护用户设备的安全和隐私,严格规定了应用权限:如果程序需要进行一些对用户比较敏感的操作,必须在Manifest文件中进行权限声明,不然程序直接崩溃。
在<receiver>标签中常用的属性:
-
android:enabled
是否可以被Android实例化;
-
android:exported
是否可以跟其他应用的组件直接交互;
发送自定义广播
发送标准广播
声明广播接收类:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "收到自定义广播", Toast.LENGTH_LONG).show();
}
}
在Manifest中注册广播:
<!--注册自定义广播-->
<receiver
android:name=".BroadcastReceivers.MyBroadcastReceiver"
android:exported="true"
android:enabled="true">
<intent-filter>
<action android:name="com.zcd.flcdemo.br.MyBroadcast"/>
</intent-filter>
</receiver>
在需要的地方发送广播:
//发送广播
btnPostBroadcast = findViewById(R.id.btn_post_broadcast);
btnPostBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.zcd.flcdemo.br.MyBroadcast");
intent.setPackage(getPackageName());
sendBroadcast(intent);
}
});
值得注意的是,默认情况下发出的广播都是隐式广播,而且当前广播注册又是静态的,所以如果不调用setPackage方法来指定接收的广播的话,那么这条广播发出去之后就不会有人接收到。
发送有序广播
新建一个有序广播接收器类:
public class AntherMyBroadcastReceivers extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "收到有序广播", Toast.LENGTH_LONG).show();
}
}
在Manifest文件中添加注册:
<!--注册有序广播一-->
<receiver android:name=".BroadcastReceivers.AntherMyBroadcastReceivers"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.zcd.flcdemo.br.MyBroadcast"/>
</intent-filter>
</receiver>
发送有序广播:
//发送有序广播
btnPostBroadcastOrdered = findViewById(R.id.btn_post_broadcast_ordered);
btnPostBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.zcd.flcdemo.br.MyBroadcast");
intent.setPackage(getPackageName());
sendOrderedBroadcast(intent, null);
}
});
与发送标准广播不同的地方仅仅是调用了sendOrderedBroadcast方法;
sendOrderedBroadcast方法的第一个参数是Intent,第二个参数是与权限相关的字符串,一般为null;
如有需要可以在Manifest文件中为有序广播的接收器添加优先级:
<!--注册有序广播一-->
<receiver android:name=".BroadcastReceivers.AntherMyBroadcastReceivers"
android:enabled="true"
android:exported="true">
<!--设置优先级-->
<intent-filter android:priority="100">
<action android:name="com.zcd.flcdemo.br.MyBroadcast"/>
</intent-filter>
</receiver>
如果要拦截广播需要在接收器中添加相应的方法:
public class AntherMyBroadcastReceivers extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "收到有序广播", Toast.LENGTH_LONG).show();
//拦截广播
abortBroadcast();
}
}
本文地址:https://blog.csdn.net/qq_40462579/article/details/107382288
上一篇: 更新PHP平台开发时,抓取页面的几种方式
下一篇: PHP安全之:重燃你的Php安全之火
推荐阅读
-
复习Android——广播
-
试读《NFC:Arduino、Android与PhoneGap近场通信》
-
《 NFC:Arduino、Android与PhoneGap近场通信》 试读
-
Android O预览版上手:请给安卓厂商一个升级的理..
-
html5写链接打开ios和android本地应用
-
android设置自定义view的宽高达到设计图比例一致的效果
-
Android architecture
-
一路走来,电子信息工程毕业生的嵌入式之路! 嵌入式系统嵌入式工程师Android工程师电子信息嵌入式linux
-
同意吗?如今的Android和iOS系统在体验上已几无差别
-
android环境搭建和入门,php环境搭建和入门,java web环境搭建和入门