Android四大组件之BroadCast

2023-03-28  本文已影响0人  南风知我咦

学习资料

简介

广播具有以下特性
广播的分类

简单使用

动态注册

实现广播接收器BroadcastReceiver
/**
 * 简单的广播接收器
 */
public class MyFirstBroadCast extends BroadcastReceiver {
    private final String TAG = "MyFirstBroadCastTAG";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "接收到广播");
        String info = intent.getStringExtra("key");
        Log.d(TAG, "广播内容:" + info);
    }
}
    /**
     * 动态注册广播
     * 这个需要再销毁页面的时候取消注册
     */
    MyFirstBroadCast firstBroadCast;

    private void initReceiver() {
        firstBroadCast = new MyFirstBroadCast();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("simple broadcast");
        registerReceiver(firstBroadCast, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != firstBroadCast)
            unregisterReceiver(firstBroadCast);
    }

    @Override
    public void initButton() {
        super.initButton();
        initButton(R.id.btn_send, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendBroadCast();
            }
        });
    }
    /**
     * 发送广播
     */
    private void sendBroadCast() {
        Intent intent = new Intent("simple broadcast");
        intent.putExtra("key", "这是一条简单的广播");
        sendBroadcast(intent);
    }

静态注册

   <receiver
            android:name=".fourassembly.broadcast.MyFirstBroadCast"
            android:exported="true">
            <intent-filter>
                <action android:name="simple broadcast"/>
            </intent-filter>
        </receiver>
    /**
     * 发送广播
     */
    private void sendBroadCast() {
        Intent intent = new Intent("simple broadcast");
        intent.putExtra("key", "这是一条简单的广播");
        intent.setPackage(getPackageName());//针对高版本静态注册的广播需要添加的内容,要不然无法接收到相应的广播
        sendBroadcast(intent);
    }

广播分类

标准广播

//以下设置失败了
        intent.setComponent(new ComponentName("com.southwind.androidfoundation.fourassembly.broadcast"
                ,"com.southwind.androidfoundation.fourassembly.broadcast.MyFirstBroadCast"));
//以下两种设置成功了
        intent.setPackage(getPackageName());
        int FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;
        intent.addFlags(FLAG_RECEIVER_INCLUDE_BACKGROUND);
    /**
     * 发送广播
     */
    @SuppressLint("WrongConstant")
    private void sendBroadCast() {
        Intent intent = new Intent("simple broadcast");
        intent.putExtra("key", "这是一条简单的广播");
//        intent.setPackage(getPackageName());//针对高版本静态注册的广播需要添加的内容,要不然无法接收到相应的广播
        //第二种解决方法,传入精确的地址,即使用精确的广播接受位置 第一个参数时包名,第二个参数是类名(需要包含包名)
//        intent.setComponent(new ComponentName("com.southwind.androidfoundation.fourassembly.broadcast"
//                ,"com.southwind.androidfoundation.fourassembly.broadcast.MyFirstBroadCast"));
        int FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;
        intent.addFlags(FLAG_RECEIVER_INCLUDE_BACKGROUND);

        sendBroadcast(intent);
    }
有序广播
public class MySecondBroadCast extends BroadcastReceiver {


    private final String TAG = "MySecondBroadCastTAG";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "第二个广播接收器,接收到广播");
        String info = intent.getStringExtra("key");
        Log.d(TAG, "广播内容:" + info);
    }
}

   <receiver
            android:name=".fourassembly.broadcast.MyFirstBroadCast"
            android:exported="true">
            <intent-filter android:priority="100">
                <action android:name="simple broadcast"/>
            </intent-filter>
        </receiver>
        <receiver
            android:exported="true"
            android:name=".fourassembly.broadcast.MySecondBroadCast">
            <intent-filter android:priority="50">
                <action android:name="simple broadcast"/>
            </intent-filter>
        </receiver>
  private final String TAG = "MyFirstBroadCastTAG";

    @Override
    public void onReceive(Context context, Intent intent) {
        //这个方法表示将截取广播,不会继续向后传递
        abortBroadcast();
        Log.d(TAG, "第一个广播接收器,接收到广播");
        String info = intent.getStringExtra("key");
        Log.d(TAG, "广播内容:" + info);
    }
}

    /**
     * 发送广播
     */
    @SuppressLint("WrongConstant")
    private void sendBroadCast() {
        Intent intent = new Intent("simple broadcast");
        intent.putExtra("key", "这是一条简单的广播");
//        intent.setPackage(getPackageName());//针对高版本静态注册的广播需要添加的内容,要不然无法接收到相应的广播
        //第二种解决方法,传入精确的地址,即使用精确的广播接受位置 第一个参数时包名,第二个参数是类名(需要包含包名)
//        intent.setComponent(new ComponentName("com.southwind.androidfoundation.fourassembly.broadcast"
//                ,"com.southwind.androidfoundation.fourassembly.broadcast.MyFirstBroadCast"));
        int FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;
        intent.addFlags(FLAG_RECEIVER_INCLUDE_BACKGROUND);

        sendOrderedBroadcast(intent,null);
    }
  <receiver
            android:name=".fourassembly.broadcast.MyFirstBroadCast"
            android:exported="true">
            <intent-filter android:priority="10">
                <action android:name="simple broadcast"/>
            </intent-filter>
        </receiver>
        <receiver
            android:exported="true"
            android:name=".fourassembly.broadcast.MySecondBroadCast">
            <intent-filter android:priority="50">
                <action android:name="simple broadcast"/>
            </intent-filter>
        </receiver>
图片.png
本地广播
   /**
     * 注册本地广播接收器
     */
    private void initLocalReceiver() {
        LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
        MySecondBroadCast broadCast = new MySecondBroadCast();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("simple broadcast");
        manager.registerReceiver(broadCast,intentFilter);
    }
    /**
     * 发送本地广播
     */
    private void sendLocalBroadCast(){
        LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
        Intent intent = new Intent("simple broadcast");
        intent.putExtra("key", "这是一条本地广播");
        manager.sendBroadcast(intent);
    }

常用的系统广播

监听网络变化 android.net.conn.CONNECTIVITY_CHANGE
关闭或打开飞行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
充电时或电量发生变化 Intent.ACTION_BATTERY_CHANGED
电池电量低 Intent.ACTION_BATTERY_LOW
电池电量充足(即从电量低变化到饱满时会发出广播) Intent.ACTION_BATTERY_OKAY
系统启动完成后(仅广播一次) Intent.ACTION_BOOT_COMPLETED
按下照相时的拍照按键(硬件按键)时 Intent.ACTION_CAMERA_BUTTON
屏幕锁屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
插入耳机时 Intent.ACTION_HEADSET_PLUG
未正确移除SD卡但已取出来时(正确移除方法:设置-SD卡和设备内存-卸载SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL
成功安装apk Intent.ACTION_PACKAGE_ADDED
成功删除apk Intent.ACTION_PACKAGE_REMOVED
重启设备 Intnet.ACTION_REBOOT
屏幕被关闭 Intent.ACTION_SCREEN_OFF
屏幕被打开 Intent.ACTION_SCREEN_ON
         <receiver
            android:name=".fourassembly.broadcast.MyFirstBroadCast"
            android:exported="true">
            <intent-filter android:priority="10">
                <action android:name="simple broadcast" />
                <action android:name="android.intent.action.SCREEN_OFF" />
            </intent-filter>
        </receiver>
private void initReceiver() {
        firstBroadCast = new MyFirstBroadCast();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("simple broadcast");
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);//屏幕开启
        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);//屏幕关闭
        registerReceiver(firstBroadCast, intentFilter);
    }
完结撒花
上一篇 下一篇

猜你喜欢

热点阅读