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

Android进程间服务通信示例

2014年01月03日 ⁄ 综合 ⁄ 共 2908字 ⁄ 字号 评论关闭

原文地址::http://codroider.net/forum.php?mod=viewthread&tid=276&page=1

 

 

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

  1. package com.services.demo2;
  2. // Declare the interface.
  3. interface IDataTimeService {
  4. String getCurrentDataTime();
  5. }

复制代码

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

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

复制代码

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

  1. public class ServicesDemo2 extends Activity {
  2. private IDataTimeService service = null;
  3. private Intent serviceIntent = null;
  4. private WebView browser;
  5. private ServiceConnection svcConn = new ServiceConnection() {
  6. public void onServiceConnected(ComponentName className, IBinder binder) {
  7. service = IDataTimeService.Stub.asInterface(binder);
  8. browser.postDelayed(new Runnable() {
  9. public void run() {
  10. updateForecast();
  11. }
  12. }, 1000);
  13. }
  14. public void onServiceDisconnected(ComponentName className) {
  15. service = null;
  16. }
  17. };
  18. @Override
  19. public void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main);
  22. browser = (WebView) findViewById(R.id.webkit);
  23. serviceIntent = new Intent(this, DataTimeServiceImpl.class);
  24. //绑定一个服务
  25. bindService(serviceIntent, svcConn, BIND_AUTO_CREATE);
  26. }
  27. @Override
  28. public void onResume() {
  29. super.onResume();
  30. /**
  31. 注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由Activity注册的接收者
  32. 接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收
  33. DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息;
  34. */
  35. registerReceiver(receiver, new IntentFilter(
  36. DataTimeServiceImpl.BROADCAST_ACTION));
  37. }
  38. @Override
  39. public void onPause() {
  40. super.onPause();
  41. unregisterReceiver(receiver);
  42. }
  43. @Override
  44. public void onDestroy() {
  45. super.onDestroy();
  46. unbindService(svcConn);
  47. }
  48. private void updateForecast() {
  49. try {
  50. String page = service.getForecastPage();
  51. if (page != null) {
  52. browser.loadDataWithBaseURL(null, page, "text/html", "UTF-8",
  53. null);
  54. browser.postDelayed(new Runnable() {
  55. public void run() {
  56. updateForecast();
  57. }
  58. }, 1000);
  59. }
  60. } catch (final Throwable t) {
  61. svcConn.onServiceDisconnected(null);
  62. }
  63. }
  64. //接收者实例
  65. private BroadcastReceiver receiver = new BroadcastReceiver() {
  66. public void onReceive(Context context, Intent intent) {
  67. runOnUiThread(new Runnable() {
  68. public void run() {
  69. updateForecast();
  70. }
  71. });
  72. }
  73. };
  74. }

复制代码

 

 

 

抱歉!评论已关闭.