全面升级Android面试之Broadcast receiver面试题集

来源:互联网 发布:python改变turtle颜色 编辑:程序博客网 时间:2024/06/08 12:15

1.广播定义
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,Android中我们要发送的广播内容是一个Intent,这个Intent中可以携带我们要传输的数据

2.广播的使用场景
A.同一个app具有多个进程的不同组件之间的消息通信
B.不同的app之间的组件消息通信

3.广播种类
1)Normal Broadcast:Context.sendBroadcast
2)System Broadcast:Context.sendOrderedBroadcast
3)Local Broadcast :只在自身的APP内传播

4.实现广播
1)静态注册:注册完成就一直运行,可以让程序在未启动的情况下就能接收到广播
具体步骤:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.jizhi.administrator.myapplication3"><uses-permission  android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity            android:name=".MainActivity"            android:theme="@style/AppTheme2">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <receiver android:name=".Broadcast.MyBroadcast1">            <intent-filter>                  <action android:name="android.intent.action.BOOT_COMPLETED"/>                      </intent-filter>        </receiver>    </application></manifest>

在< application>标签中,设置了一个新的标签< receiver>,所有的静态广播的注册都是在这里进行注册的。它的用法和activity的注册类似,也是通过指定android:name来指定具体注册哪一个广播接收器,然后在 < intent-filter>中加入我们想要接收的广播就行了。同样,监听系统开机广播也要声明权限android.permission.RECEIVE_BOOT_COMPLETED
这样在再次开机后,MyBroadcast1就会接收到这条开机广播,并处理相应的事情。
需要注意的是:在广播接收器的onReceiver()方法中,不要添加过多的逻辑或者任何耗时的操作,因为在广播接收器中是不允许开启线程的,当onReceive()方法运行了较长的时间而没有结束的时候,程序就会报错。因此,广播接收器通常扮演者打开程序其他组件的角色,比如创建一个状态栏通知,或者启动一个服务等。

2)动态注册:动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低。动态注册广播不是 常驻型广播 ,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。

5.内部实现机制
1)自定义广播几首者BroadcastReceiver,并覆写onRecvice()方法;
2) 通过Binder机制向AMS(Activity Manager Service)进行注册;
3)广播接收者通过Binder机制向AMS发送广播;
4)AMS查找符合相应条件(IntentFilter|permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中
5)消息循环执行拿到此广播,回调BroadcastReceiver中的Receiver()方法.

原创粉丝点击