现在的位置: 首页 > 综合 > 正文

activity和service之间如何进行通信?

2013年12月07日 ⁄ 综合 ⁄ 共 1466字 ⁄ 字号 评论关闭

 

Android的最重要的组件就是Service和Acitivity,那么在使用过程中,我们最常遇到的问题是他们之间的通信问题。

首先Activity调用Service
这个比较基础的,它有两个常见的方法:
第一:通过Intent,这个比较简单了,可以指定package name和class name的方式调用,Intent。setClassName这个成员
即可。通过putString进行数据装载,startService(intent)即可。例子如下:

<service android:name="com.exampleone.service.LocalService">
 <intent-filter>
  <action android:name="aaa"/>
  <category android:name="android.intent.category.DEFAULT"/>
 </intent-filter>
</service>

Intent intent=new Intent("aaa");
intent.putExtra("data","helloData");
startService(intent);

第二:通过IPC,这个比较麻烦,一般用不着,这里不谈

但是,反过来,Service如何将一些状态告诉给Acitivity呢?方法有两种
第一:Service通过广播的形式发送boardcast,我们写一个boardcastReceiver即可。通常的情况下,将
boardcastReceiver写成Activity的内部类,这个onReceiver可以直接调用activity的方法来更新界面。
但是内部类只能采用代码注册的方法registerReceiver(),不能再androidManifest.xml文件中进行静态
的声明,因为内部类要依赖于外部类而存在的,如果一定要用androidManifest。xml来注册receiver,那
么只能把boardcastReceiver写成单独的文件的public类。这时候,你想更新界面就比较麻烦了,你只能
自己把你要更新的acitvity运行起来,然后再向这个activity的内部类发广播的消息来更新界面。

第二:service直接向activity发intent,在service里面进行startActivity,是属于在Activity外
startActivity即在task外启动activity,因此,必须在intent加入一个参数如下:
Intent intentSend=new Intent(Constants.ACTION_STATUS);
intentSend.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intentSend.putExtra("status","end");
startActivity(intentSend);

但是此时会引发一个问题,多次startActivity会导致很多的activity实现运行,这肯定不是我们要德,我只要
一个Activity就可,此时,我们要在androidMainfest里面对这个activity的launchMode设置singleInstance

<Activity android:name="com.demo.Activity" android:launchMode="singleInstance">
 
</Activity>

记住啦,有人设置singleTask也可以,但他们有一点区别

 

【上篇】
【下篇】

抱歉!评论已关闭.