Android基础_浅谈广播机制

1.广播基础

Android广播类BroadReceive。

Android中的广播可以分为两种类型:标准广播、有序广播。

标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎会在同一时间接收到此广播,它们之间没有先后顺序,所以广播是无法被截断的。

有序广播:是一种同步执行的广播,广播发出之后同一时刻只会有一个广播接收器收到这条广播消息,当这个接收器执行完操作后,广播才会继续传递。广播接收器按照广播优先级先后接收广播,广播是可以被截断的。

要接收广播,必须先要注册广播接收器,注册广播有两种形式。①动态注册(在代码中注册); ②静态注册(在AndroidManifest.xml中注册);


2.动态注册广播(监听网络状态变化)

动态注册广播就是在代码中注册,我们可以控制在何时广播接收器有效,在何时接收器无效。下面举个监听网络状态的例子来理解一下动态注册广播。

MainActivity.java

class MainActivity extends Activity {
    
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;
<pre name="code" class="java">    
@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); //活动结束注销广播接收器
<pre name="code" class="java">    }<span style="font-family: KaiTi_GB2312;">    </span>

 
<span style="font-family: KaiTi_GB2312;">
</span>
}
 

NetworkChangeReceiver.java(别忘了在AndroidManifest.xml中注册广播类)

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
	String action = intent.getAction();                          //接收到广播,得到广播的动作
	if(action.equals("android.net.conn.CONNECTIVITY_CHANGE")){   //判断是否为网络状态改变的广播,如果是则进行相应的操作
	    ConnectivityManager connectionManager = (ConnectivityManager)
	    getSystemService(Context.CONNECTIVITY_SERVICE);
	    NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
	    if (networkInfo != null && networkInfo.isAvailable()) {
		Toast.makeText(context, "network is available",
		Toast.LENGTH_SHORT).show();
	    } else {
		Toast.makeText(context, "network is unavailable",
		Toast.LENGTH_SHORT).show();
	    }
	}
    }
}

动态注册广播接收器可以自由地控制注册和注销,在灵活性方面有很大的优势,但是它的缺点就是必须在程序启动的时候广播注册才可生效。


3.静态注册实现开机启动

思路就是,当机器开机时会发送一条"android.permission.RECEIVE_BOOT_COMPLETED"的系统广播,我们只需要接收此广播,在收到此广播后进行相应的操作就实现了开机启动。

静态注册AndroidManifest.xml中写法。

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
<pre name="code" class="html">    
<receiver android:name=".BootCompleteReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
    
</application>

 其中<receiver></receiver>之间就是广播的静态注册,和活动的注册类似,android:name声明广播接收器的类名。在<intent-filter></intent-filter>中添加要接收的广播动作。 


4.发送自定义广播

发送:

<span style="font-family:KaiTi_GB2312;">Intent intent = new Intent("Hg.action.getData.IrDA"); //建立一个自定义的广播动作
intent.putExtra("msgData", aHW);           //在intent中添加数据
sendBroadcast(intent);</span><span style="font-family:KaiTi_GB2312;font-weight: bold;"> </span><strong>                    </strong><span style="font-family:KaiTi_GB2312;">//发送广播</span>

接收:静态或者动态注册,在广播类中重写onReceive甄别出"Hg.action.getData.IrDA"广播动作,然后获取出数据做相应操作。

if(action.equals("Hg.action.getData.IrDA")){
    Bundle bundle = intent.getExtras();
    if (bundle != null){
        String str = bundle.getByteArray("msgData");
    }
}
在1中我们已经说了标准广播和有序广播的区别。

发送标准广播用sendBroadcast(),所以广播接收器同时收到该广播。

发送有序广播用sendOrderedBroadcast(),并且要在AndroidManifest.xml中广播注册中添加优先级,这样便可发送有序广播,且优先级越高就优先接收此广播,如果我们在广播接收处理里引用abortBroadcast()方法,则截断广播传递,此广播不会再被广播接收器收到。

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


5.使用本地广播

前面我们发送和接收的广播全部都是属于系统全局广播,即发出的广播可以被其他任何的任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样就很容易会引起安全性的问题,比如说我们发送的一些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的程序不停地向我们的广播接收器里发送各种垃圾广播。

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


//注册接收本地广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
LocalReceiver localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值