您的位置:首页 > 移动开发 > Android开发

广播--android学习

2016-04-23 21:40 417 查看
创建一个广播接收器:
创建一个类,并继承BroadcastReceiver,并重写父类方法onReceive()

动态注册广播
例子:

<span style="font-size:14px;">public class MainActivity extends Activity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);//注册
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);//动态注册的广播一定要取消注册
}
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "network changes",
Toast.LENGTH_SHORT).show();
}
}
}
</span>
如果程序访问一些系统的关键性信息,必须在配置文件中声明权限才可以。
打开AndroidManifest.xml文件,在里面加入以下权限就可以查询系统网络状态:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

静态注册广播
动态注册必须在程序启动后才能接收到广播,因为注册的逻辑写在onCreat()中。静态注册能够在程序在未启动的情况下接收广播。
让程序接收开机广播的例子:
<span style="font-size:14px;">public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
}
}
</span>
AndroidManifest静态注册和权限写入
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
......
<receiver android:name=".BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>


自定义广播
广播的接收方法同上两种,重要的是如何发送广播:

1.发送标准广播

用sendBroadcast()方法将广播发送出去,这样有监听com.example.broadcasttest.MY_BROADCAST这条广播的广播接收器就会收到消息
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);


2.发送有序广播

用sendOrderedBroadcast()方法,接收两个参数,第一个仍是Intent,第二个是权限相关字符串。
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent,null);


在AndroidManifest静态注册广播时,设置优先级<intent-filter android:priority="100" >

保证这个活动在相比低于100优先级时最先接收到。

然后在其onReceive()内调用abortBroadcast()方法,进行截断,导致后面的广播接收器无法再收到这条广播。

本地广播
使用这个机制发出的广播只能够在应用程序内部进行传递,解决全局广播的安全性问题。
主要使用LocalBroadcastManager来对广播进行管理

发送本地广播:

LocalBroadcastManager LBM = LocalBroadcastManager.getInstance(this);//获取实例
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
LBM.sendBroadcast(intent);//发送本地广播


接收与注册本地广播:
IntentFilter intentFilter = new IntentFilter();
intentFiter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
LocalReceiver localReceiver = new LocalReceiver();
LBM.registerReceiver(localReceiver,intentFilter);//注册本地广播监听器


取消动态注册本地广播:
@Override
protected void onDestroy() {
super.onDestroy();
LBM.unregisterReceiver(localReceiver);
}


接收本地广播的触发事件处理:
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received local broadcast",Toast.LENGTH_SHORT).show();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: