Broadcast广播机制

来源:互联网 发布:自由之战末那之冠淘宝 编辑:程序博客网 时间:2024/06/03 22:45

一、接收一个系统广播:动态注册接收系统网络变化
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
原创粉丝点击