简单的android进程间(远程)服务通信示例【AIDL方式】

举报
ShaderJoy 发表于 2021/12/30 01:48:48 2021/12/30
【摘要】 背景:两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送。 Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服...

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

1.编写aidl文件

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

值得注意的是:其中不能加修饰符(private、public等)、AIDL不支持的数据类型(如InputStream和OutputStream)等内容。在清单文件中还需要配置AIDL服务,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。




  
  1. package net.blogjava.mobile.aidl;
  2. interface IMyService
  3. {
  4. String getValue();
  5. }

2.编写服务的实现类

在这个示例中为MyService.java,内容如下:


  
  1. public class MyService extends Service
  2. {
  3. public class MyServiceImpl extends IMyService.Stub
  4. {
  5. @Override
  6. public String getValue() throws RemoteException
  7. {
  8. // TODO Auto-generated method stub
  9. return "Android/OPhone开发讲义";
  10. }
  11. }
  12. @Override
  13. public IBinder onBind(Intent intent)
  14. {
  15. return new MyServiceImpl();
  16. }
  17. }

在清单文件中配置MyService类,代码如下:


  
  1. <service android:name=".MyService">
  2. <intent-filter>
  3. <action android:name="net.blogjava.mobile.aidl.IService"/>
  4. </intent-filter>
  5. </service>


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

新建一个工程,并将自动生成的IMyService.java文件连同包目录一起复制到本工程下的src目录中
如图所示:


  
  1. public class Main extends Activity implements OnClickListener
  2. {
  3. private IMyService myService = null;
  4. private Button btnInvokeAIDLService;
  5. private Button btnBindAIDLService;
  6. private TextView textView;
  7. private ServiceConnection serviceConnection = new ServiceConnection()
  8. {
  9. @Override
  10. public void onServiceConnected(ComponentName name, IBinder service)
  11. {
  12. myService = IMyService.Stub.asInterface(service);
  13. btnInvokeAIDLService.setEnabled(true);
  14. }
  15. @Override
  16. public void onServiceDisconnected(ComponentName name)
  17. {
  18. // TODO Auto-generated method stub
  19. }
  20. };
  21. @Override
  22. public void onClick(View view)
  23. {
  24. switch (view.getId())
  25. {
  26. case R.id.btnBindAIDLService:
  27. bindService(new Intent("net.blogjava.mobile.aidl.IMyService"),
  28. serviceConnection, Context.BIND_AUTO_CREATE);
  29. break;
  30. case R.id.btnInvokeAIDLService:
  31. try
  32. {
  33. textView.setText(myService.getValue());
  34. }
  35. catch (Exception e)
  36. {
  37. }
  38. break;
  39. }
  40. }
  41. @Override
  42. public void onCreate(Bundle savedInstanceState)
  43. {
  44. super.onCreate(savedInstanceState);
  45. setContentView(R.layout.main);
  46. btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
  47. btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService);
  48. btnInvokeAIDLService.setEnabled(false);
  49. textView = (TextView) findViewById(R.id.textview);
  50. btnInvokeAIDLService.setOnClickListener(this);
  51. btnBindAIDLService.setOnClickListener(this);
  52. }
  53. }



文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/8782215

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。