1、如何接收广播
接收广播首先要编写一个广播接收器类,该类必须从BroadcastReceiver或者子类继承。
在BroadcastReveiver.onReceive(Context context,Intent intent)中编写处理广播的代码,并且要在AndroidManifest.xml中注册。
1)自定义BroadcastReceiver类
class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
//当接收广播后要执行的代码
//如果同一个广播接收器处理多个广播,则可以使用intent.getAction()来判断
if("action1".equals(intent.getAction()){
.....
}else if ("action1".equals(intent.getAction()){
.....
}
}
}
2)注册广播,在AndroidManifest.xml添加活着动态注册
<receiver android:name=".MyBroadcastReceiver">
<!-- intent过滤器,指定可以匹配哪些intent, 一般需要定义action,可以是自定义的也可是系统的 -->
<intent-filter>
<action android:name="com.lydia.broadcast.test"/>
</intent-filter>
</receiver>
3)发送广播
//指定广播动作
Intent intent = new Intent("com.lydia.broadcast.test");
// 添加category
intent.addCategory("com.lydia.mycategory");
// 设置广播数据
intent.putExtra("name","broadcast_data");
// 发送广播
sendBroadcast(intent); //发送广播事件
#######################################
2、注册方法有2种:动态注册和静态注册
1)静态注册:在AndroidManifest.xml注册,android不能自动销毁广播接收器,也就是说当应用程序关闭后,还是会接收广播。
<receiver android:name=".MyBroadcastReceiver">
<!-- intent过滤器,指定可以匹配哪些intent, 一般需要定义action,可以是自定义的也可是系统的 -->
<intent-filter>
<action android:name="com.lydia.broadcast.test"/>
</intent-filter>
</receiver>
2)动态注册:在代码中通过registReceiver()手工注册,该接收器也会随之销毁。当然,也可手工调用unregisterReceiver()进行销毁。
//注册代码:
//生成BraodcastReceiver对象
MyBroadcastReceiver myReceiver = new MyBroadcastReceiver();
//生成一个IntentFilter对象
IntentFilter filter = new IntentFilter();
filter.addAction("com.lydia.broadcast.test");
//将BroadcastReceiver对象注册到系统当中
MyActivity.this.registerReveiver(myReceiver,filter);
// 销毁代码:
unregisterReceiver(myReceiver);
#######################################
3、面试题:如何拦截手机屏幕休眠和唤醒的动作?
当按手机的电源键时手机黑屏,这是休眠状态;当再次按下手机电源键时屏幕会变亮,并处于锁屏状态,这叫屏幕唤醒,当来电话或者短信时,手机屏幕会亮,这也是屏幕唤醒。
自定义广播接收器,接收这两个动作:
ScreenOnOffReceiver.java
public class ScreenOnOffReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)) {
Log.i("TAG", "屏幕唤醒了");
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
Log.i("TAG", "屏幕休眠了");
}
}
}
在MainActivity中注册该广播
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ScreenOnOffReceiver screen = new ScreenOnOffReceiver();
//设置屏幕唤醒广播的动作
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
//设置屏幕休眠广播的动作
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(screen, intentFilter);
}
}
#######################################
4、面试题:如何让一个Activity在开机后自动显示?
需要使用广播机制拦截手机启动的广播,然后再onReceive()方法中打开Activity才能在开机时自动显示Activity。广播接收器类(StartupReceiver.java)的onReceive()中的代码如下:
public void onReceive(Context context,Intent intent){
Intent mainIntent = new Intent(context,Main.class);
//在广播接收器中显示Activity,必须要设置FLAG_ACTIVITY_NEW_TASK标志
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainIntent);
}
AndroidManifest.xml中注册StartupReceiver类
<receiver android:name="StartupReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<!--<category android:name="android.intent.category.HOME" />-->
</intent-filter>
</receiver>
添加权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
注意:有网友说下面这段话,但是我测试成功了,能接受到广播,我用的是华为手机Android4.1.2! 大家可以自己测试下。
谷歌为了安全考虑(避免流氓软件、病毒啊干坏事,还能提高效率),4.0以后加了2个Flag:FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES。系统发出的广播带有FLAG_EXCLUDE_STOPPED_PACKAGES这个flag,在应用进程没有启动的情况下是不能接收到的。
当然如果是用户自定义的广播可以带有FLAG_INCLUDE_STOPPED_PACKAGES这个flag,那么即使应用没启动也可以收到广播(很遗憾啊!只能是三方自定义的广播)。