您的位置:首页 > 其它

Broadcast广播机制

2016-06-10 13:29 351 查看
一、接收一个系统广播:动态注册接收系统网络变化

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

4000
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: