`

Android四大组件之BroadcastReceiver

 
阅读更多

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics