Broadcast广播机制

一、接收一个系统广播:动态注册接收系统网络变化
Manifest文件注册:(允许接收网络状态)

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

更多声明权限:
https://developer.android.com/reference/android/Manifest.permission.html

内部类:

//内部类继承BroadcastReceiver,在onReceive内书写广播逻辑
    class NetworkChangedReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager)
                    getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if(networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(MainActivity.this, "network available", Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(MainActivity.this, "network not available", Toast.LENGTH_SHORT).show();
            }
        }
    }

MainActivity中:

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

        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//网络变化时发出的Action
        networkChangedReceiver = new NetworkChangedReceiver();
        registerReceiver(networkChangedReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangedReceiver);
    }

二、接收一个系统广播:静态注册实现开机启动
动态注册写在onCreate方法中,只能应用开启后接收,静态注册可在未开启接收。
接收器类编写:

public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
    }
}

Manifest文件注册:
(开机自启权限)

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

(接收器静态注册)

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        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=".BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
    </application>

三、发送自定义广播:发送标准广播
标准广播:即发送广播后,所有符合的广播接收器都接收到此广播,广播不可以在中途被截断。

广播接收器类:

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Receive my broadcast", Toast.LENGTH_SHORT).show();
    }
}

Manifest文件注册:

<receiver android:name=".MyBroadcastReceiver">
            <intent-filter>
                <action android:name="com.example.barbara.broadcast.MY_BROADCAST"/>
            </intent-filter>
        </receiver>

发送广播:

                Intent intent = new Intent("com.example.barbara.broadcast.MY_BROADCAST");
                sendBroadcast(intent);

四、发送自定义广播:发送有序广播
只需要在标准广播的基础上改动一行代码
发送广播代码:

                Intent intent = new Intent("com.example.barbara.broadcast.MY_BROADCAST");
                sendOrderedBroadcast(intent, null);

截断广播:
假如有两个app都能接收这个广播(另一个app只需要有一个广播接收器类同时静态注册,注册时添加同样的action)
Q:如何规定两个app的接收顺序呢?
A:在intent-filter的priority属性规定优先级,这里设置成100.

<receiver android:name=".MyBroadcastReceiver">
            <intent-filter android:priority="100">
                <action android:name="com.example.barbara.broadcast.MY_BROADCAST"/>
            </intent-filter>
        </receiver>

Q:如何截断广播?
A:在广播接收器中截断。

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Receiver another broadcast", Toast.LENGTH_SHORT).show();
        abortBroadcast();//截断
    }
}

五、发送本地广播
之前我们看到的都是全局的广播,就存在许多安全上的问题,那么,我们如何发送一个只能在本app内接收的广播呢?
其实很简单,我们只需要利用LocalBroadcastManager这个类来对广播进行管理。
注:本地广播只能动态注册
内部接收器类:

    class LocalBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "Receive local broadcast", Toast.LENGTH_SHORT).show();
        }
    }

发送广播,注册接收器:

    private LocalBroadcastManager localBroadcastManager;
    private LocalBroadcastReceiver localBroadcastReceiver;

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

        button2 = (Button) findViewById(R.id.button2);
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.barbara.broadcast.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });

        //注册本地接收器
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.barbara.broadcast.LOCAL_BROADCAST");
        localBroadcastReceiver = new LocalBroadcastReceiver();
        localBroadcastManager.registerReceiver(localBroadcastReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localBroadcastReceiver);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值