broadcast
1.广播是什么
1.1 定义
在Android中,它是一种广泛运用在应用程序之间传输信息的机制,Android中我们发送广播内容是一个intent,这个Intent中可以携带我们要发送的数据。
1.2 广播的使用场景
a.同一APP内有多个进程的不同组件之间的消息通信。
b.不同app之间的组件之间消息的通信。
1.3 广播的种类
标准广播:context.sendBroadcast(Intent)方法发送的广播,不可被拦截
有序广播:context.sendorderBroadcast(Intent)方法发送的广播,可被拦截
本地广播:localBroadcastManager.sendBroadcast(Intent),只在app内传播
2.广播接收器
广播接收器是专门用来接收广播信息的,它可分为静态注册和动态注册:
静态注册:注册完成一直在运行。
首先你要创建一个广播接收器类,实例代码如下:
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onreceive(Context context, Intent intent) {
toast.maketext(context, "Boot Complete", Toast.LENGTH_LONG).show();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
代码非常简单,我们只是在onReceive()方法中使用Toast弹出一段信息提示信息。
另外,静态的广播接收器一定要在Androidmanifest.xml文件中注册才可以使用,AndroidManifest.xml文件中注册静态广播代码如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest"
android:versionCode="1"
android:versionName="1.0" >
……
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
……
<receiver
android:name=".BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
可以看到,标签内出现了一个新的标签,所有静态的广播接收器都是在这里进行注册的。它的用法其实和标签非常相似,也是通过android:name来指定具体注册哪一个广播接收器,而enabled和exported属性则是根据我们刚才勾选的状态自动生成的,也可以自己添加,没有就自己添加嘛!
动态注册:跟随Activity的生命周期。
如何创建一个广播接收器呢?其实就需要新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。这样有广播到来时,onReceive()方法就会得到执行,具体的逻辑就可以在这个方法中处理。来个简单的例子来理解以下,如何监听网络变化呢?其实就是新建一个广播接收器去接收来自系统网络变化的广播即可,代码如下所示:
public class MainActivity extends AppCompatActivity{
private IntentFilter intentFilter;
private NetWorkChangeReceiver netWorkChangeReceiver;
@Override
protected void onCreate(Bundle savedinstanceState){
super.Oncreata(savedInstanceState);
setcontentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetWorkChangeReceiver();
registerreceiver(networkChangeReceiver, intentFilter);//注册广播接收器
}
@Overrid
protected void onDestroy(){
unregisterReceiver(networkChangeReceiver);//一定要记得取消广播接收器的注册
super.onDestroy();
}
class NetworkChangeReceiver extends BroadcastReceiver{//广播接收器类
@Override
public void onReceiver(Context context,Intent intent){
//这里需要权限,需要在AndroidManifest.xml中进行网络访问权限申请:
//<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
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();
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
动态注册广播接收器的优点以及缺点:动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。那么有没有广播能在程序未启动的情况下就能接收到广播呢?静态注册的广播接收器就可以做到。
3.广播内部实现机制
a.自定义广播接收者BroadcastReceiver,并且重写onReceiver()方法。
b.通过Binder机制向AMS(Activity Manager Service)进行注册。
c.广播发送者通过Binder机制向AMS发送广播。
d.AMS查找符合条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到相应的BroadcastReceiver(一般情况下是Activity)的消息队列中。
e.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceiver()方法。
4.本地广播
本地广播的发送和注册广播接收器都需要使用到LocalBroadcastManager类,如下所示为本地广播的发送和本地广播接收器注册的代码:
本地广播的发送:
public static void sendLocalBroadcast(Context context,String action){
Intent intent = new Intent(action);
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
localBroadcastManager.sendBroadcast(intent);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
本地广播的接收器的注册:
IntentFilter intentFilter = new IntentFilter();
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
intentFilter.addAction(new BroadcastUtil().action_next);
nasbr = new NextAndStartBroadcastReceiver();
localBroadcastManager.registerReceiver(nasbr, intentFilter);//注册本地广播接收器
- 1
- 2
- 3
- 4
- 5
- 6
- 7
相比于系统广播而言,本地广播更加安全,更加高效,以下是本地广播的特点以及内部的实现机制:
特点:
a.使用它发送的广播将只在自身app内传播,因此你不必担心泄漏隐私的数据。
b.其他app无法对你的app发送该广播,因此你的app根本不可能收到非自身app发送的该广播,因此你不必担心有安全漏洞可以利用。
c.比系统广播更加高效。
内部实现机制:
a.LocalBroadcast高效的原因:因为它内部是通过handler实现的,它的sendBroadcast()方法含义并非和系统的sendBroadcast()一样,它的sendBroadcast()方法其实就是通过Handler发送了一个message而已。
b.LocalBroadcast安全的原因:既然它是通过Handler实现广播发送的,那么相比系统广播通过Binder机制实现那肯定更加高效,同时使用Handler来实现,别的app无法向我们应用发送该广播,而我们app内部发送的广播也不会离开我们的app。
LocalBroadcast内部协作主要是靠两个Map集合:mReceivers和mActions,当然还有一个List集合mPendingBroadcasts,这个主要存储待接收的广播对象。
相关阅读
微信小程序在推出后立即引起了众多商家的关注。实际上,每当一个工具刚上线时,都处于用户开始增长的阶段,而且这也是商家更有可能获利
转载自郭工文件 SecureCRT是一款支持SSH(SSH1和SSH2)、Telnet、串口等的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主
Guava Ordering的使用 参考 官方说明文档-OrderingExplained Guava强大的”流畅风格比较器”-翻译版 Guava —- Ordering排序
网页中使用的特殊字体(webdings, wingdings 2)
前言对字体的相关介绍可以参考 网页中使用的字体介绍 经常在某些网页中看到一些特殊的效果:比如一个红色的圆圈, 一个
蚂蚁森林这个游戏想必支付宝平台的用户都有听说过,不光是因为平台对活动的大力推广,更因为它的公益性质,以及大家可以免费兑换种植一