两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送。
Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了.现在来实现一个HelloWorld级的服务以及在Activity中使用这个服务。步骤如下:

1.编写aidl文件,在这个文件中提供了服务所提供的方法的接口,文件的扩展名为aidl,在我们的示例中命名为IDataTimeService.aidl文件的内容为如下所示:

package com.services.demo2;// Declare the interface.interface IDataTimeService {String getCurrentDataTime();}

2.编写服务的实现类,在这个示例中为DataTimeService.java,内容如下:

public class DataTimeService extends Service{public static final String BROADCAST_ACTION = "com.services.demo2.DataTimeServiceEvent";/**  使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的  sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有Activity注册的接收者进行处理;  */private Intent broadcast = new Intent(BROADCAST_ACTION);sendBroadcast(broadcast);private final IDataTimeService.Stub binder = new IDataTimeService.Stub() {public String getCurrentDataTime() {return (getCurrentDataTimeImpl());}};synchronized private String getCurrentDataTimeImpl() {Date date=new Date();return (date.toLocaleString());}@Overridepublic IBinder onBind(Intent intent) {return (binder);}}

3.现在编写一个Activity,来消费这个服务:

public class ServicesDemo2 extends Activity {private IDataTimeService service = null;private Intent serviceIntent = null;private WebView browser;private ServiceConnection svcConn = new ServiceConnection() {public void onServiceConnected(ComponentName className, IBinder binder) {service = IDataTimeService.Stub.asInterface(binder);browser.postDelayed(new Runnable() {public void run() {updateForecast();}}, 1000);}public void onServiceDisconnected(ComponentName className) {service = null;}};@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);browser = (WebView) findViewById(R.id.webkit);serviceIntent = new Intent(this, DataTimeServiceImpl.class);//绑定一个服务bindService(serviceIntent, svcConn, BIND_AUTO_CREATE);}@Overridepublic void onResume() {super.onResume();/**    注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由Activity注册的接收者  接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收  DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息;  */registerReceiver(receiver, new IntentFilter(DataTimeServiceImpl.BROADCAST_ACTION));}@Overridepublic void onPause() {super.onPause();unregisterReceiver(receiver);}@Overridepublic void onDestroy() {super.onDestroy();unbindService(svcConn);}private void updateForecast() {try {String page = service.getForecastPage();if (page != null) {browser.loadDataWithBaseURL(null, page, "text/html", "UTF-8",null);browser.postDelayed(new Runnable() {public void run() {updateForecast();}}, 1000);}} catch (final Throwable t) {svcConn.onServiceDisconnected(null);}}//接收者实例private BroadcastReceiver receiver = new BroadcastReceiver() {public void onReceive(Context context, Intent intent) {runOnUiThread(new Runnable() {public void run() {updateForecast();}});}};}

更多相关文章

  1. Android——文件路径(/mnt/sdcard/...)、Uri(content://media/ex
  2. 64位 ubuntu android SDK 无法新建AVD,adb 没有那个文件或目录的
  3. Android开发---xml布局文件中的常见属性总结
  4. webservice二进制文件传输
  5. 浅谈Android文件管理器的几种实现方式(原理篇)--对我有帮助
  6. Android文件系统深入剖析
  7. Qt on Android:资源文件系统qrc与assets
  8. Android数据存储方式(一)文件
  9. Android工程中R.java文件突然消失

随机推荐

  1. mysql分组后取各组前五条
  2. MYSQL社区版安装手册
  3. 有没有办法确定是由Web应用程序(php进程)执
  4. mysql客户端工具使用
  5. PHP Array - 保存到MySQL时的奇数数据
  6. mysql 触发器 自动补全字段
  7. MySql-cluster中NDBD进程占用内存能否通
  8. JAVA使用JDBC连接MySQL数据库
  9. 如何在VB.net中进行备份和恢复mysql数据
  10. win7下Django的MySql安装,问题解决方案