BroadcastRecevier广播的基本使用

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

效果图:
这里写图片描述


这里写图片描述


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值