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,那么即使应用没启动也可以收到广播(很遗憾啊!只能是三方自定义的广播)。