• [置顶] Android四大组件之BroadcastReceiver


    Android四大组件之BroadcastReceiver

    Broadcast Receiver
    广播接收器,是一种负责接收广播消息并对消息做出响应的组件,和Service一样并不提供与用户交互的UI界面。它和事件处理机制类似,只不过事件处理机制是程序组件级别,而广播事件是系统级别。

          系统源码:frameworks/base/core/java/android.content.BroadcastReceiver.java


    1)BroadcastReceiver生命周期 

           BroadcastReceiver对象仅在调用onReceive()方法时有效,当该方法调用完毕,系统将摧毁这个对象。当下次再次受到广播的时候将再次new生成一个BroadcastReceiver对象。当onReceive()方法在大概10秒内没有执行完毕,系统会认为该程序无响应,所以在onReceive()方法如果需要做一些耗时的工作,我们可以通过发送Intet给其他Activity或Service来完成。


    2)Android标准的广播ACTION

    ACTION_TIME_TICK	
    ACTION_TIME_CHANGED	时间改变
    ACTION_TIMEZONE_CHANGED
    ACTION_BOOT_COMPLETED	系统启动完毕
    ACTION_PACKAGE_ADDED	添加apk包
    ACTION_PACKAGE_CHANGED	apk包改变
    ACTION_PACKAGE_REMOVED
    ACTION_PACKAGE_RESTARTED
    ACTION_PACKAGE_DATA_CLEARED
    ACTION_UID_REMOVED
    ACTION_BATTERY_CHANGED	电源改变
    ACTION_POWER_CONNECTED	连接电源
    ACTION_POWER_DISCONNECTED
    ACTION_SHUTDOWN 	关机
    ACTION_CAMERA_BUTTON	拍照
    ACTION_MEDIA_MOUNTED

    3)发布广播

            我们可以在应用程序中创建自定义的广播事件。广播的内容和用于过滤广播的Action都通过Intent对象发送出去。

    {
    	protected static final String MY_ACTION="com.example.myBroadcast.ACTION"
    	Intent intent = new Intent();
    	intent.setAction(MY_ACTION);
    	intent.putExtra("msg", "This is my a broadcast message");
    	sendBroadCast(intent);
    }

    在上述代码中我们通过setAction()方法向Intent对象中加入了过滤广播的动作,这个动作是我们自定义的,像Android中内置的广播动作一样,这个动作可以用来唯一的识别我们自定义的广播。

    在Context中系统提供了三种发送广播的方法:

    (1) Context.sendBroadcast();
    所有满足条件的BroadcastReceiver都会执行其onReceive()方法

    (2) Context.sendStickyBroadcast();
    发送出去的Intent一直存在,而且如果以后系统中注册的BroadcastReceiver满足这个Action时会立即接收到这个广播。

    (3) Context.sendOrderedBroadcast();
    发送出去的广播会根据BroadcastReceiver注册时IntentFilter设置的优先级的属性来执行其onReceive()方法,相同优先级的BroadcastReceiver执行onReceive()方法的顺序不确定。

    4)Broadcast Receiver的注册

    如果我们希望在应用程序中能接受到某个广播(Android系统内置的广播或我们自己定义的广播),并且对收到的广播进行处理,那么我们需要创建一个BroadcastReceiver类,在其onReceive()方法中对广播进行处理。同时我们还需要对我们的BroadcastReceiver进行注册(告诉系统自己的存在)。

    注册BroadcastReceiver的方法有两种:

    (1)在AndroidManifest.xml文件中注册
    在AndroidManifest.xml中注册的广播属于常驻型广播,即使应用程序关闭了,还能接收到广播。

    首先我们需要创建一个类,继承自BroadcastReceiver并实现其onReceive()方法

    public class MyBroadcastReceiver extends BroadcastReceiver {
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		String msg = intent.getStringExtra("msg");
    		Toast.makeText(context, "接收到的广播为:"+msg, Toast.LENGTH_LONG).show();
    	}
    }


    然后在AndroidManifest.xml中注册:


    <receiver android:name=".MyBroadcastReceiver">
    	<intent-filter>
    		<action android:name="com.example.myBroadcast.ACTION"/>
    	</intent-filter>
    </receiver>



    (2)在应用程序的代码中注册
    在代码中使用registerReceiver()方法动态注册的广播属于非常驻型广播,当应用程序关闭后,我们调用了unregisterReceiver()解除了BroadcastReceiver,这种方法比较灵活。

    在Activity中我们可以在onResume()方法中通过调用registerReceiver()方法注册我们的BroadcastReceiver
    然后在onStop()方法中调用unregisterReceiver()方法进行解注册。

    MyBroadcastReceiver myReceiver = null;
    protected void onResume() {
    	super.onResume();
    	if(myReceiver == null ) {
    		myReceiver = new MyBroadcastReceiver();
    		IntentFilter filter = new InterFilter();
    		filter.addAction(MY_ACTION);
    		registerReceiver(myReceiver, filter);
    	}
    }
    
    protected void onStop() {
    	if( myReceiver != null ) {
    		unregisterReceiver(myReceiver);
    		myReceiver = null;
    	}
    	super.onStop();
    }



  • 相关阅读:
    ubuntu安装软件失败
    阶乘函数 注意事项
    汇编退出
    vim比较文件
    汇编调试
    Redis
    记录一次ajax使用
    oracle11g导出dmp文件时不能导出空表,导致缺表
    将小数点后的0去掉
    redis
  • 原文地址:https://www.cnblogs.com/james1207/p/3281209.html
Copyright © 2020-2023  润新知