广播接受者broadcastreceiver

                                                                           breadcastreceiver作为安卓四大组件之间一般作为通讯

静态创建:

XML代码:

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.broadcastrescvierdemo.MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="send"
        android:text="静态注册发送广播" />
</RelativeLayout>

 

 

 

 

java代码:

 

//使用静态注册创建一个广播接受者
//第一步创建个类继承BroadcastReceiver
public class MyBroadCastReceiver extends BroadcastReceiver {
    //第二步重写onrReceive方法
    @Override
    public void onReceive(Context context, Intent intent) {
        //接受广播数据数据在intent里面
        Toast.makeText(context, intent.getStringExtra("text"), Toast.LENGTH_SHORT).show();
        //拦截有序广播
        abortBroadcast();
    }
}

 

 

 

 

mainfest代码

 

<!--第三步注册,建立白名单管理,设置action接受的活动和category一般DEFAULT-->
<receiver android:name=".MyBroadCastReceiver">
    <!--在intent-filter里面设置优先级一般是-1000到1000-->
    <intent-filter android:priority="900">
        <!--自定义的活动-->
        <action android:name="ok" />
        <!--系统的活动,飞行模式,可以定义自动需要的活动-->
        <action android:name="ACTION_AIRPLANE_MODE_CHANGED" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

 

 

 

 

 

mainactivity代码

 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void send(View view) {
        //sendBroadcast()方法在context的方法他的子类都可以调用这方法
        //这里设置了自定义的活动名称,广播接受者注册必须设置通样的活动名称
        Intent intent= new Intent("ok");
        //携带数据发广播
        intent.putExtra("text","activity 发了一个广播");
        //无序广播(拦截不了)
        //sendBroadcast(intent);
        //有序广播(广播接受者设置优先级可以先后接受到广播,先接受到的广播可以对广播拦截,后面的接受不到)
        sendOrderedBroadcast(intent,null);
        //粘性广播(可以等待的广播,比较耗资源,过期了)
       // sendStickyBroadcast(intent);
    }
}

 

 

 

//当mainactivity发送一个广播,静态创建个广播接受者就可以获取到广播。

注意:这个广播是全局的广播(所有app如果配置了活动都可以接受)。

 

 

 

//动态创建broadcastreceiver

 

//动态创建
public class MainActivity extends AppCompatActivity {

    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);

        //注册广播

        //设置过滤(白名单)
        //电池电量Intent.ACTION_BATTERY_CHANGED
        //飞行模式Intent.ACTION_AIRPLANE_MODE_CHANGED
        IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        filter.addAction("text");
        //设置优先级
        filter.setPriority(500);

        //注册
        registerReceiver(receiver, filter);

    }

    @Override
    protected void onDestroy() {
        //注销广播
        unregisterReceiver(receiver);
        receiver = null;
        super.onDestroy();

    }

    //发广播
    public void send(View view) {
        //发送无序广播
        //注意自定义发的广播必须要标注个活动(在注册中添加到活动中)
        Intent intent = new Intent("text");
        intent.putExtra("broadCast", "发送一个无序广播");
        sendBroadcast(intent);

    }


    //动态创建广播接受者
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //接受系统的广播
            String action = intent.getAction();

            if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                //获取目前电池电量
                int level = intent.getIntExtra("level", 0);
                tv.setText("当前电池电量:" + level);
            }

            boolean b = Settings.System.getInt(getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 0 ? false : true;
            Log.e("TAG", "--------------->>飞行模式:" + b);


            //接受activity自定义的发送的广播
            String broadCast = intent.getStringExtra("broadCast");
            Log.e("TAG", "--------------->>activity:" + broadCast);
            if (!TextUtils.isEmpty(broadCast))
                Toast.makeText(context, broadCast, Toast.LENGTH_SHORT).show();

        }
    };

}

 

//总结

静态创建优点:APP没有启动也可以接受到,在8.0后无效。

缺点:系统需要到每个APP的mainfest配置文件去匹配,太消耗资源。

 

动态创建优点:系统无需到mainfest文件匹配,占用系统资源少。

缺点:APP需要启动才可以接受。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值