android中,不同进程之间传递信息要用到广播,可以有两种方式来实现。
第一种方式:在Manifest.xml中注册广播,是一种比较推荐的方法,因为它不需要手动注销广播(如果广播未注销,程序退出时可能会出错)。
<pre name="code" class="java">具体实现在Manifest的application中添加:
<receiver android:name=".mEvtReceiver"> <intent-filter> <action android:name="android.intent.action.Helloworld" /> </intent-filter> </receiver>
上面两个android:name分别是广播名和广播的动作(这里的动作是表示系统启动完成),如果要自己发送一个广播,在需要发送处你需要写如下的代码:
Intent i = new Intent("android.intent.action.Helloworld");// 名字一致 sendBroadcast(i);这个广播就算是发送出去了,然后就是接收。接收一般是建立一个新的类,这个类继承BroadcastReceiver,然后重新onReceive 方法,实现如下:
public class NoficationReceiver extends BroadcastReceiver { public void onReceiver(final Context context, Intent intent) { if("android.intent.action.Helloworld".equals(intent.getAciton())) { //do something } }
第二种方式:
声明并非在 Manifest 中,而是在代码里面动态的加载,代码如下:
private void registerBroadcastReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.heelworld"); registerReceiver(content, filter);原理其实很简单,就是将注册工作,收到完成,记住这个API即可. 关于如何写do someting 里面的内容我们必须要遵守一个准则,不能有耗时的工作.
这带来一个问题,当一个广播消息的响应时费时的,因此应该在独立的线程中做这些事,远离用户界面其它组件运行的主线程。如果onReceive()衍生线程然后返回,整个进程,包括新的线程,被判定为不活跃的(除非进程中的其它应用程序组件是活跃的),将使它处于被杀的危机。解决这个问题的方法是onReceive()启动一个服务,及时服务做这个工作,因此系统知道进程中有活跃的工作在做。