原文:http://mobile.51cto.com/abased-386439_1.htm

众所周知,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. packagecom.suns.ButtonChanged;
  2. importandroid.content.BroadcastReceiver;
  3. importandroid.content.Context;
  4. importandroid.content.Intent;
  5. importandroid.view.View;
  6. publicclassBroadcasttestextendsBroadcastReceiver{
  7. @Override
  8. publicvoidonReceive(Contextarg0,Intentarg1){
  9. //TODOAuto-generatedmethodstub
  10. ButtonChangedActivity.getButton().setVisibility(View.GONE);
  11. ButtonChangedActivity.getBar().setVisibility(View.VISIBLE);
  12. }
  13. }

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


ButtonChangeActivity.java:

        
  1. packagecom.suns.ButtonChanged;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. importandroid.content.IntentFilter;
  5. importandroid.os.Bundle;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. importandroid.widget.ProgressBar;
  10. publicclassButtonChangedActivityextendsActivity{
  11. /**Calledwhentheactivityisfirstcreated.*/
  12. privatestaticButtonbutton=null;
  13. privatestaticProgressBarbar=null;
  14. privateBroadcasttestt;
  15. privateIntentFilterfilter;
  16. @Override
  17. publicvoidonCreate(BundlesavedInstanceState){
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);
  20. button=(Button)findViewById(R.id.button);
  21. bar=(ProgressBar)findViewById(R.id.bar);
  22. button.setOnClickListener(newButtonClick());
  23. }
  24. publicstaticButtongetButton()
  25. {
  26. returnbutton;
  27. }
  28. publicstaticProgressBargetBar()
  29. {
  30. returnbar;
  31. }
  32. @Override
  33. protectedvoidonDestroy(){
  34. //TODOAuto-generatedmethodstub
  35. super.onDestroy();
  36. ButtonChangedActivity.this.unregisterReceiver(t);
  37. }
  38. classButtonClickimplementsOnClickListener
  39. {
  40. @Override
  41. publicvoidonClick(Viewv){
  42. //TODOAuto-generatedmethodstub
  43. t=newBroadcasttest();
  44. filter=newIntentFilter();
  45. filter.addAction(Intent.ACTION_EDIT);
  46. Intentintent=newIntent();
  47. intent.setAction(Intent.ACTION_EDIT);
  48. ButtonChangedActivity.this.registerReceiver(t,filter);
  49. ButtonChangedActivity.this.sendBroadcast(intent);
  50. }
  51. }
  52. }

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

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

main.xml:

        
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns: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>

更多相关文章

  1. Android Root方法原理解析及Hook(四) GingerBreak
  2. 32、adb INSTALL_FAILED_TEST_ONLY 处理方法
  3. js调Android与IOS方法
  4. android studio 添加按钮点击事件的三种方法
  5. 使用eclipse与android studio 在开发自定义控件时的区别
  6. 在android中运行java main方法
  7. android 按钮 背景 文字 自定义

随机推荐

  1. 5 个pandas神级操作,最后一个长见识了!
  2. 刷爆全网的动态条形图,原来5行Python代码
  3. 新一代Notebook神器出现,Jupyter危险了!
  4. 总结一些网站加密和混淆技术
  5. 爱了!安利一个相见恨晚的可视化学习网站
  6. 今天网站都变成灰色了,这其中是怎么实现的
  7. JavaScript 逆向爬取实战
  8. 用Echarts打造一个轮播图!
  9. 做动态图表,没有数据?用Python就能获取!
  10. 看完这篇文章,我彻底爱上了Python动态图表