Android系统中的广播(Broadcast)机制简要介绍和学习计划

本文简要介绍了Android系统中的广播机制,强调其在组件间通信的重要性,特别是对于跨进程通信和松耦合系统架构的角色。通过一个计数器服务的例子,展示了如何使用广播在后台线程和界面线程之间传递数据。广播机制遵循发布/订阅模式,类似于J2EE的消息驱动Bean和COM的连接点。文章最后提到了后续会深入分析注册广播接收器和发送广播的过程。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

        在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制;这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用;本文通过一个简单的例子来学习Android系统的广播机制,为后续分析广播机制的源代码作准备。

《Android系统源代码情景分析》一书正在进击的程序员网(http://0xcc0xcd.com)中连载,点击进入!

        在Android系统中,为什么需要广播机制呢?广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间可以用来通信的方式就更多了,这样看来,广播机制似乎是多余的。然而,广播机制却是不可替代的,它和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。

        在软件工程中,是非常强调模块之间的高内聚低耦合性的,不然的话,随着系统越来越庞大,就会面临着越来越难维护的风险,最后导致整个项目的失败。Android应用程序的组织方式,可以说是把这种高内聚低耦合性的思想贯彻得非常透彻,在任何一个Activity中,都可以使用一个简单的Intent,通过startActivity或者startService,就可以把另外一个Activity或者Service启动起来为它服务,而且它根本上不依赖这个Activity或者Service的实现,只需要知道它的字符串形式的名字即可,而广播机制更绝,它连接收者的名字都不需要知道。

        不过话又说回来,广播机制在Android系统中,也不算是什么创新的东西。如果读者了解J2EE或者COM,就会知道,在J2EE中,提供了消息驱动Bean(Message-Driven Bean),用来实现应用程序各个组件之间的消息传递;而在COM中,提供了连接点(Connection Point)的概念,也是用来在应用程序各个组间间进行消息传递。无论是J2EE中的消息驱动Bean,还是COM中的连接点,或者Android系统的广播机制,它们的实现机理都是消息发布/订阅模式的事件驱动模型,消息的生产者发布事件,而使用者订阅感兴趣的事件。

        废话说了一大堆,现在开始进入主题了,和前面的文章一样,我们通过具体的例子来介绍Android系统的广播机制。在这个例子中,有一个Service,它在另外一个线程中实现了一个计数器服务,每隔一秒钟就自动加1,然后将结果不断地反馈给应用程序中的界面线程,而界面线程中的Activity在得到这个反馈后,就会把结果显示在界面上。为什么要把计数器服务放在另外一个线程中进行呢?我们可以把这个计数器服务想象成是一个耗时的计算型逻辑,如果放在界面线程中去实现,那么势必就会导致应用程序不能响应界面事件,最后导致应用程序产生ANR(Application Not Responding)问题。计数器线程为了把加1后的数字源源不断地反馈给界面线程,这时候就可以考虑使用广播机制了。

        首先在Android源代码工程中创建一个Android应用程序工程,名字就称为Broadcast吧。关于如何获得Android源代码工程,请参考在Ubuntu上下载、编译和安装Android最新源代码一文;关于如何在Android源代码工程中创建应用程序工程,请参考在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务一文。这个应用程序工程定义了一个名为shy.luo.broadcast的package,这个例子的源代码主要就是实现在这里了。下面,将会逐一介绍这个package里面的文件。 

        首先,我们在src/shy/luo/broadcast/ICounterService.java文件中定义计数器的服务接口:

package shy.luo.broadcast;public interface ICounterService {        public void startCounter(int initVal);        public void stopCounter();}
       这个接口很简单,它只有两个成员函数,分别用来启动和停止计数器;启动计数时,还可以指定计数器的初始值。

       接着,我们来看一个应用程序的默认Activity的实现,在src/shy/luo/broadcast/MainActivity.java文件中:

package shy.luo.broadcast;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener private final static String LOG_TAG = "shy.luo.broadcast.MainActivity";     private Button startButton = nullprivate Button stopButton = nullprivate TextView counterText = null;  private ICounterService counterService = null;         @Override        public void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.main);                    startButton = (Button)findViewById(R.id.button_start);            stopButton = (Button)findViewById(R.id.button_stop);            counterText = (TextView)findViewById(R.id.textview_counter);                    startButton.setOnClickListener(this);            stopButton.setOnClickListener(this);                    startButton.setEnabled(true);            stopButton.setEnabled(false);                    Intent bindIntent = new Intent(MainActivity.this, CounterService.class);            bindService(bindIntent, serviceConnection, Context.BIND_AUTO_CREATE);                    Log.i(LOG_TAG, "Main Activity Created.");        }            @Override         public void onResume() {         super.onResume();              IntentFilter counterActionFilter = new IntentFilter(CounterService.BROADCAST_COUNTER_ACTION);     registerReceiver(counterActionReceiver, counterActionFilter);        }            @Override        public void onPause() {         super.onPause();         unregisterReceiver(counterActionReceiver);        }            @Override        public void onDestroy() {         super.onDestroy();         unbindService(serviceConnection);        }            @Override        public void onClick(View v) {         if(v.equals(startButton)) {      if(counterService != null) {       counterService.startCounter(0);              startButton.setEnabled(false);                 stopButton.setEnabled(true);      }         } else if(v.equals(stopButton)) {      if(counterService != null) {       counterService.stopCounter();              startButton.setEnabled(true);       stopButton.setEnabled(false);      }         }        }            private BroadcastReceiver counterActionReceiver = new BroadcastReceiver(){  public void onReceive(Context context, Intent intent) {   int counter = intent.getIntExtra(CounterService.COUNTER_VALUE, 0);   String text = String.valueOf(counter);   counterText.setText(text);      Log.i(LOG_TAG, "Receive counter event");  } };  private ServiceConnection serviceConnection = new ServiceConnection() {         public void onServiceConnected(ComponentName className, IBinder service) {      counterService = ((CounterService.CounterBinder)service).getService();            Log.i(LOG_TAG, "Counter Service Connected");         }          public void onServiceDisconnected(ComponentName className) {      counterService = null;      Log.i(LOG_TAG, "Counter Service Disconnected");         }        };}

        MainActivity的实现也很简单,它在创建(onCreate)的时候,会调用bindService函数来把计数器服务(CounterService)启动起来,它的第二个参数serviceConnection是一个

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值