android 广播详解与实例(Broad Receiver)

来源:互联网 发布:猪八戒的前世今生 知乎 编辑:程序博客网 时间:2024/05/29 15:47

      

  • 系统全局广播

       以下3个例子属于系统全局广播,是一种可以跨进程的通信方式,从自己的应用程序发出的广播,其他的应用程序也是可以收到的。


一、接收系统广播

public class UserActivity extends Activity{    private BroadcastReceiver broadcastReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);//去除标题setContentView(R.layout.activity_user);networkChangeReceiver();//接收网络状态改变的系统广播}}public void networkChangeReceiver(){broadcastReceiver = new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent){//runOnUiThread(new Runnable()//{//@Override//public void run()//{//ConnectivityManager是一个系统服务类,专门用于管理网络连接ConnectivityManager connectivityManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);//获取ConnectivityManager实例//获取NetworkInfo实例NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();if(networkInfo != null && networkInfo.isAvailable()){Toast.makeText(MyApplication.getContext(), "network is available", Toast.LENGTH_LONG).show();}else{Toast.makeText(MyApplication.getContext(), "network is unavailable", Toast.LENGTH_LONG).show();}//}//});}};IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(Const.networkChange_action);registerReceiver(broadcastReceiver, intentFilter);}

二、发送自定义标准广播标准广播异步执行,所有广播器接收到广播信息,但无法被截断

     1. 创建MyBroadcastReceiver类


public class MyBroadcastReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {// TODO 自动生成的方法存根Toast.makeText(MyApplication.getContext(), "received in mybroadcastReceiver", Toast.LENGTH_LONG).show();}}

     2. 在AndroidManifestexml对广播接收器进行修改

    <application...>
    ...
 <receiver 
            android:name="com.example.BroadcastReceiver.MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.BroadcastReceiver.MY_BROADCAST" />
            </intent-filter>
        </receiver>
    </application>


      3. 在activity里发送广播(可利用Intent传送数据)

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


三、发送自定义有序广播标准广播同步执行,广播器接收广播信息有先后顺序,优先级搞定广播接收器可截断信息


     1. 在AndroidManifestexml对广播接收器进行修改


<manifest ...>
      <application...>
      ...
          <receiver 
              android:name="com.example.BroadcastReceiver.MyBroadcastReceiver"
              android:enabled="true"
              android:exported="true">
              //把MyBroadcastReceiver的优先级设成100,优先级高的广播接收器先收到广播
              <intent-filter  
android:priority="100">  
                  <action android:name="com.example.BroadcastReceiver.MY_BROADCAST" />
              </intent-filter>
          </receiver>
      </application>
</manifest>

      2. 在activity里发送广播


        Intent intent = new Intent("com.example.BroadcastReceiver.MY_BROADCAST");
        //用 sendOrderedBroadcast就发送有序广播
        sendOrderedBroadcast(intent,null);  //第一个参数是Intent,第二个参数是一个与权限相关的字符串

     3. 修改MyBroadcastReceiver类

public class MyBroadcastReceiver extends BroadcastReceiver{

        @Override
         public void onReceive(Context context, Intent intent) {
                 // TODO 自动生成的方法存根
                Toast.makeText(MyApplication.getContext(), "received in mybroadcastReceiver", Toast.LENGTH_LONG).show();
                abortBroadcast();  //用abortBroadcast();将广播截断
}

}


  • 本地广播

      只能在应用程序内部传递的广播,安全性高(LocalBroadcastManager)。

例子:
       本地广播注册与接收的函数:
/** * 本地广播 */public void LocalBroadcastReceiver(){localReceiver = new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent){runOnUiThread(new Runnable(){@Overridepublic void run(){Toast.makeText(MyApplication.getContext(), "received local broadcast", Toast.LENGTH_LONG).show();}});}};IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("com.example.BroadcastReceiver.MY_BROADCAST");localBroadcastManager.registerReceiver(localReceiver, intentFilter);}

       函数的应用:
empty

       取消注册:
/** * 销毁activity */@Overrideprotected void onDestroy(){super.onDestroy();//if(broadcastReceiver != null){//unregisterReceiver(broadcastReceiver);//取消注册广播//}localBroadcastManager.unregisterReceiver(localReceiver);//取消注册本地广播}














0 0