Android Broadcast广播机制深入解析

移动开发 Android
在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。这个广播跟我们传统意义中的电台广播有些相之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理。另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。

众所周知,Android的四大组件是Activity,Service,ContentProvider和Broadcast。可见 Broadcast的重要性。何谓广播机制,我想大家对广播肯定不陌生,发出去的广播,是没有任何目的性的,没有一个明确的目标,至于谁会收到,发送广播 的人肯定不会知道。

android中的broadcast也是如此,一个activity发出广播,也并不知道哪个activity会响应。那么是什么样的activity会响应呢?一个activity是如何发送广播呢?对于广播我们又该如何处理呢?下面我们来一步一步了解。

首先,一个activity是如何发出一个广播的?

是通过sendBroadcast()函数,函数的参数为一个intent对象,该对象最重要的是定义了动作,将广播发送出去后,能够处理该动作的其他activity便能够接收广播,并作出响应。

那么其他的activity是如何知道自己该接受什么动作呢?

是通过过滤器fliter。在filter中定义了能够响应的所有动作,如果广播发出的动作存在于filter当中,该activity就响应,反之忽略广播。

那么,接受了广播之后,该activity又该执行什么操作呢?

这里我们要说一下,对广播的响应我们是通过类BroadcastReceiver来实现的,我们通过继承该类,并重载其onReceive方法,能够自定义执行后该做的处理。

我们还需要了解什么是动作

所谓动作,即action,其实大体上说就是对要进行操作的描述。android给我们自定义了很多动作,例如 ACTION_EDIT,ACTION_VIEW,等等。它们对即将进行的操作进行了描述,就像ACTION_EDIT,就将操作描述为编辑。那么能够实 现编辑功能的activity就会响应。系统定义的action有很多,在此不再赘述,大家想要详细了解的话可以参考官方文档。那么除了官方提供的,我们 用得更多的还是我们自定义的action,自己对要实现的动作做一个描述,通常的表示方法为“包名”+“.”+“动作描述”。例 如:“com.suns.HTTPRequestActivity.BUTTONCHANGE”,分解开 即”com.suns.HTTPRequestActivity“+“.”+"BUTTONCHANGE"。就自定义了一个按钮变化的action。其实 这只是一个命名规律的字符串罢了,为的只是让intent和fliter能够对应,还有让人们知道这个动作是干嘛的。

广播能用几种方法实现呢?它们有什么区别联系?

实现广播的方法有两种。一种是在androidmanifest.xml当中去注册广播,另一种方法是在代码中动态注册广播,这两种方法虽然都能实 现广播机制,但是还是有很大不同,所以运用也要分情况。如果我们在androidmanifest.xml中去定义的话,那么该广播是在activity 结束之后也不会结束的,原因在于它已经写在了manifest.xml文件当中,也就是注册到了系统当中,所以无论你的activity是否存在,对于该 广播没有影响。而在java代码中动态注册广播,在该activity结束后,我们可以注销该广播,也就是它随着activity的消失而消失。这样解 释,大家都应该清楚了。如果是一些系统应用,比如手机没电后震动啊,后台计算流量啊这样的功能,需要一直存在的,我们可以在 androidmanifest.xml中注册,而一些只有该activity存在时才有意义的广播,比如更改界面等等,就用动态注册比较合 适,activity都没了。该广播还有什么用呢?只会浪费资源而已。

好了,说了这么多,我们还是需要用一个例子去应用一下它。

首先先是动态注册广播的,点击界面上的button后,发送更改button的广播,然后button变为进度条。

代码如下:

Broadcasttest.java:

  1. package com.suns.ButtonChanged;  
  2.   
  3. import android.content.BroadcastReceiver;   
  4. import android.content.Context;   
  5. import android.content.Intent;   
  6. import android.view.View;  
  7.   
  8. public class Broadcasttest extends BroadcastReceiver{  
  9.   
  10.     @Override   
  11.     public void onReceive(Context arg0, Intent arg1) {   
  12.         // TODO Auto-generated method stub   
  13.         ButtonChangedActivity.getButton().setVisibility(View.GONE);   
  14.         ButtonChangedActivity.getBar().setVisibility(View.VISIBLE );   
  15.           
  16.     }  

下一页将为您介绍ButtonChangeActivity.java实现代码以及main.xml

#p#

ButtonChangeActivity.java:

  1. package com.suns.ButtonChanged; 
  2.   
  3.  import android.app.Activity;  
  4.  import android.content.Intent;  
  5.  import android.content.IntentFilter;  
  6.  import android.os.Bundle;  
  7.  import android.view.View;  
  8.  import android.view.View.OnClickListener;  
  9.  import android.widget.Button;  
  10.  import android.widget.ProgressBar; 
  11.   
  12.  public class ButtonChangedActivity extends Activity {  
  13.      /** Called when the activity is first created. */  
  14.      private static Button button=null;  
  15.      private static ProgressBar bar=null;  
  16.      private Broadcasttest t;  
  17.      private IntentFilter filter;  
  18.      @Override  
  19.      public void onCreate(Bundle savedInstanceState) {  
  20.          super.onCreate(savedInstanceState);  
  21.          setContentView(R.layout.main);  
  22.          button=(Button)findViewById(R.id.button);  
  23.          bar=(ProgressBar)findViewById(R.id.bar);  
  24.          button.setOnClickListener(new ButtonClick());  
  25.      }  
  26.       
  27.      public static Button getButton()  
  28.      {  
  29.          return button;  
  30.      }       
  31.      public static ProgressBar getBar()  
  32.      {  
  33.          return bar;  
  34.      }  
  35.       
  36.       
  37.      @Override  
  38.      protected void onDestroy() {  
  39.          // TODO Auto-generated method stub  
  40.          super.onDestroy();  
  41.          ButtonChangedActivity.this.unregisterReceiver(t);         
  42.      } 
  43.   
  44.      class ButtonClick implements OnClickListener  
  45.      { 
  46.   
  47.          @Override  
  48.          public void onClick(View v) {  
  49.              // TODO Auto-generated method stub  
  50.              t=new Broadcasttest();  
  51.              filter=new IntentFilter();  
  52.              filter.addAction(Intent.ACTION_EDIT);  
  53.              Intent intent=new Intent();  
  54.              intent.setAction(Intent.ACTION_EDIT );  
  55.              ButtonChangedActivity.this.registerReceiver(t, filter);  
  56.              ButtonChangedActivity.this.sendBroadcast(intent);  
  57.           
  58.          }  
  59.      }  

我们用registerReceiver函数去注册一个广播响应事件,有两个参数,***个是我们自定义的receiver对象,第二个即是过滤器。

注意:我们要在activity的onDestroy()方法中注销该广播!

main.xml:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2.  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.      android:layout_width="fill_parent"  
  4.      android:layout_height="fill_parent"  
  5.      android:orientation="vertical" >       
  6.      <Button  
  7.          android:id="@+id/button"  
  8.          android:layout_width="fill_parent"  
  9.          android:layout_height="wrap_content"  
  10.          android:text="点击"  
  11.          />  
  12.      <ProgressBar  
  13.          android:id="@+id/bar"  
  14.          android:visibility="gone"  
  15.          android:layout_width="wrap_content"  
  16.          android:layout_height="wrap_content"  
  17.          style="?android:attr/progressBarStyle"  
  18.          />      
  19.  </LinearLayout> 

 

责任编辑:闫佳明 来源: cnblogs
相关推荐

2021-11-24 08:33:09

Android广播机制应用程序

2010-10-08 10:42:30

2013-11-26 16:32:47

Android关机移动编程

2017-05-03 17:00:16

Android渲染机制

2014-06-23 10:31:09

Android启动过程

2013-04-24 11:15:56

Android开发Touch事件传递机制

2021-09-15 07:31:33

Android窗口管理

2023-09-26 08:01:46

消费者TopicRocketMQ

2017-07-12 14:58:21

AndroidInstant Run

2014-12-10 10:37:45

Android自定义布局

2017-02-21 12:20:20

Android事件分发机制实例解析

2021-09-09 06:55:43

AndroidViewDragHel原理

2021-10-15 09:19:17

AndroidSharedPrefe分析源码

2010-08-04 13:52:53

Flex事件机制

2016-05-18 17:15:17

互动出版网

2013-12-27 14:34:46

Android开发Android应用短信触发示例

2011-05-30 15:35:06

Android 广播接收者

2021-09-16 06:44:04

Android进阶流程

2010-11-22 14:18:32

MySQL锁机制

2017-01-13 22:42:15

iosswift
点赞
收藏

51CTO技术栈公众号