BroadcastRecevier广播的基本使用

来源:互联网 发布:js文本框获得焦点 编辑:程序博客网 时间:2024/06/05 15:17

BroadcastRecevier的有序、普通、动态和静态启动以及数据传递

1、什么是BroadcastRecevier?
BroadcastRecevier是一个系统级别的监听器,比如:插上耳机、电池电量发生变化、切换飞行模式等等都会由系统发送广播,我们的App可以接收过个广播,并做出相应的响应。

2、广播发送的两种类型:

A) 发送普通广播:sendBroadcast(Intent intent);

B) 发送有序广播:sendOrderedBroadcast(intent, receiverPermission)

3、BroadcastReceiver的生命周期很短,只有10秒左右,如果在广播中要完成一个耗时的任务,可以将该任务通过Service去完成。

4:每一个广播都通过一个Action字符串进行标识。

5:动态广播必须使用代码注册和反注册广播,如果要想在BroadcastRecevier中访问Activity,可以将该BroadcastRecevier定义成为Activity的一个内部类。动态广播无需在AndroidManifest.xml中配置。

6、说明:当系统中的某个App删除后,会发送android.intent.action.PACKAGE_REMOVED广播,广播接收器MyBroadcastReceiver会接收该广播,并自动调用onReceive方法。

实例:/** * BroadcastRecevier的简单使用: * 1:动态启动:可实例化广播类 * 2:静态启动:无法接受接口返回的数据 * 3:普通启动:配置文件的action要和代码里面的action一致 * @author Administrator * */public class MainActivity extends Activity implements SendData{     MyBroadcastRecevier myb;//广播类     @Override     protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            this.setContentView(R.layout. activity_main);     }     /**      * 动态启动,可通过接口传递数据   *      * @param v      */     public void but1(View v) {           IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED );//系统广播        myb = new MyBroadcastRecevier ();        registerReceiver( myb, intentFilter); //注册,动态启动广播            myb.setSd( this); //绑定set     }     /**      * 静态启动,不能通过接口传递数据(因为我们无法实例化(系统自动实例化),所以无法用接口传递或返回数据)      * @param v      */     public void but2(View v) {           Intent intent = new Intent(MyBroadcastRecevier. ACTION); //自定义广播           intent.putExtra( "name", "sunshine");            this.sendOrderedBroadcast(intent, null); //有序广播     }     /**      * 普通,静态启动广播      * <receiver android:name="com.example.mytest4.MyBroadcastRecevier"      *           android:exported="true">      *           <intent-filter >      *                  <action android:name="android.intent.action.EDIT" />      *           </intent-filter>            * </receiver>      * @param v      */     public void but3(View v) {           Intent intent = new Intent();           intent.setAction(Intent. ACTION_EDIT); //要和AndroidManifest.xml里的保持一致           MainActivity. this.sendBroadcast(intent); //广播     }    @Override    protected void onStop() {         super.onStop();         if( myb != null){            //反注册,否则会无限调用             unregisterReceiver( myb);         }    }    /**     * 通过接口将数据返回     */     @Override     public void data(String s) {            if(s!= null){                Log. e("tag: " , s);                Toast. makeText(getApplicationContext(), s, 1000).show();           }     }}----------public class MyBroadcastRecevier extends BroadcastReceiver {     protected static final String ACTION = MyBroadcastRecevier.class.getName();//获得完整类名     private static final String TAG = MyBroadcastRecevier.class.getSimpleName();//获得类名     private SendData sd;     public void setSd(SendData sd) {            this. sd = sd;     }     /**      * 广播自动调用该方法      */     @Override     public void onReceive(Context arg0, Intent intent) {            /**            *  动态启动传值            */            /*Bundle bundle = intent.getExtras();           // 获取当前电量            int current = bundle.getInt("level");           // 获取总电量(电池的电池容量)            int total = bundle.getInt("scale");           sd.data("当前电量:" + current + ",总电量:" + total);*/            /**            *  静态启动传值            */           String s = intent.getStringExtra( "name");           Log. e(TAG, "广播启动成功: " + s);           Toast. makeText(arg0, "=======", 1000);     }     /**      * 传值接口      *      * @author Administrator      *      */     public interface SendData {            public void data(String s);     }}----------配置BroadcastRecevier:        <receiverandroid:name="com.example.mytest4.MyBroadcastRecevier"            android:exported= "true">            <intent-filter >                 <action android:name= "com.example.mytest4.MyBroadcastRecevier" />            </intent-filter >        </receiver >

小案例:插入耳机时界面现红色,拔出耳机现白色

public class MainActivity extends Activity {    private LinearLayout layout;    private BackgroundReceiver br;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        layout = (LinearLayout) findViewById(R.id.layout);        br = new BackgroundReceiver();    }    @Override    protected void onStart() {        super.onStart();        //注册广播        IntentFilter filter = new IntentFilter();        //在耳机口上插入耳机时发出的广播        filter.addAction(Intent.ACTION_HEADSET_PLUG);        //注册        this.registerReceiver(br, filter);    }    @Override    protected void onStop() {        super.onStop();        //反注册        unregisterReceiver(br);    }    /**     * 广播接收器,Activity的内部类     * @author 手撕包菜     *     */    class BackgroundReceiver extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {            if(intent.hasExtra("state")){                int state = intent.getIntExtra("state", 0);                if(state == 0){                    //如果耳机被拨出,背景变白                    layout.setBackgroundColor(Color.WHITE);                    Toast.makeText(getApplicationContext(), "耳机被拨出", 1000).show();                }else{                    //如果耳机被插入,背景弯红                    layout.setBackgroundColor(Color.RED);                    Toast.makeText(getApplicationContext(), "耳机插入", 1000).show();                }            }        }    }}源码下载地址:http://download.csdn.net/detail/sunshine_mood/9418381

效果图:
这里写图片描述


这里写图片描述


小案例效果图:
这里写图片描述

0 0