广播接收者

本文介绍了Android中有序与无序广播的区别,静态和动态注册Receiver的方法,以及如何在MainActivity和BroadcastReceiver中实现自定义广播和数据传递。重点讲解了如何在清单文件中配置广播接收器,以及如何确保内存管理的正确性。
摘要由CSDN通过智能技术生成
/*
有序广播  高优先级的 Receiver 可以决定低优先级的 Receiver 是否还能收到广播
无序广播  所有广播都是异步同时发送,此时 Receiver 的接收时序也是完全随机的。

         正因为异步且无需保证时序,所以无需广播更高效,但是不能在各个 Receiver 之间传递数据。
静态注册  在 AndroidManifest.xml 中添加以下注册代码  注册的是接收器。静态注册的程序不管是否启动
          ,都可以收得到匹配的广播的,并对这个广播操作。
动态注册  通过Context.registerReceiver()方法进行注册

只有静态动态注册,没有静态动态接收,注意清单文件里的权限和可接收广播类型(系统或自定义)。

创建一个类继承自BroadcastReceiver,然后覆写onReceive(Context context, Intent intent)方法
          ,其中广播传递的参数就在 intent 当中,我们可以在 onReceive() 方法中取出。
同样在APP之间也可以进行广播,APP1和APP2一样,有mainactivity和BR,在APP1输入内容,发送广播,被APP2接收器接收并显示出来。

https://www.jianshu.com/p/e9b97a5e8149     系统广播
 */
public class MainActivity extends AppCompatActivity {

    public static final String MY_ACTION = "com.imooc.demo.My_Broadcast";//自定义广播名
    public static final String BROADCAST_CONTENT = "broadcast_content";//数据名
    private ImoocBroadcastReceiver mBroadcastReceiver;
    private EditText mInputEditText;
    private Button mSendBroadcastButton;
    private TextView mResultTextView;

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

        // 获取包名做title
        setTitle(getPackageName());

        mInputEditText = findViewById(R.id.inputEditText);
        mSendBroadcastButton = findViewById(R.id.sendBroadcastButton);
        mResultTextView = findViewById(R.id.resultTextView);

        //动态注册
        // 新建广播接收器       没有参数   ,   也可传入参数  根据接收器的构造方法。
        mBroadcastReceiver = new ImoocBroadcastReceiver(mResultTextView);
        // 注册广播接收器    实例化意图过滤器    为广播接收器添加Action
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.intent.action.PACKAGE_REMOVED");//应用被卸载广播
        intentFilter.addAction(MY_ACTION);//自定义广播
        registerReceiver(mBroadcastReceiver, intentFilter);

        //点击事件:发送广播,接收用户的输入,塞入 intent 并通过 Broadcast 发送出去
        mSendBroadcastButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 新建广播
                Intent intent = new Intent(MY_ACTION);//自定义广播
                // 放入广播要携带的数据(String name,String value)  名字对应的值
                intent.putExtra(BROADCAST_CONTENT, mInputEditText.getText().toString());
                sendBroadcast(intent);
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消注册广播接收器,不然会导致内存泄露
        if (mBroadcastReceiver != null) {
            unregisterReceiver(mBroadcastReceiver);
        }
    }
}
/*
广播接收器,接收广播并传入参数TextView把TextView内容显示出来。
 */
public class ImoocBroadcastReceiver extends BroadcastReceiver {

    TextView mTextView;

    public ImoocBroadcastReceiver() {
    }

    //mainactivity里调用这个广播接收器的构造方法,可传入参数
    //限制广播功能
    public ImoocBroadcastReceiver(TextView textView) {
        mTextView = textView;
    }

    private static final String TAG = "ImoocBroadcastReceiver";

    //重写该方法
    @Override
    public void onReceive(Context context, Intent intent) {
        // 接收广播
        if (intent != null) {
            // 接收到的是什么广播
            String action = intent.getAction();
            Log.d(TAG, "onReceive:接收到的消息: " + action);

            // 判断是什么广播(是不是我们自己发送的自定义广播)
            if (TextUtils.equals(action, MainActivity.MY_ACTION)) {
                // 获取广播携带的内容, 获取广播中名字对应的值
                String content = intent.getStringExtra(MainActivity.BROADCAST_CONTENT);
                if (mTextView != null) {
                    //应在main里面的新建接收器时把该参数写入防止此时为空。
                    mTextView.setText("接收到的action是:" + action + "\n接收到的内容是:\n" + content);
                    //action为 MY_ACTION = "com.imooc.demo.My_Broadcast"
                    //content为 广播中携带的广播源的输入的内容
                }
            }
        }
    }
}

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jinanchang.broadcastapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- 静态注册广播接收器 -->
        <receiver android:name=".ImoocBroadcastReceiver">

            <!-- 接收哪些广播 -->

            <intent-filter>
                <!-- 开机广播 -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <!-- 电量低广播 -->
                <action android:name="android.intent.action.BATTERY_LOW" />
                <!-- 应用被安装广播 -->
                <action android:name="android.intent.action.PACKAGE_INSTALL" />
                <!-- 应用被卸载广播 -->
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <!-- 数据类型 -->
                <data android:scheme="package" />

                <!-- 自定义广播 -->
                <action android:name="com.imooc.demo.afdsabfdaslj" />

            </intent-filter>

        </receiver>

    </application>

</manifest>

还有APP间和activity间,见收藏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值