一、问题描述
AndroID应用程序的四大组件中Activity、broadcastReceiver、ContentProvIDer、Service都可以进行跨进程。在上一篇我们通过ContentProvIDer实现了不同应用之间的跨进程调用,但ContentProvIDer主要是提供数据的共享(如sqlite数据库),那么我们希望跨进程调用服务(Service)呢?AndroID系统采用了远程过程调用(RPC)方式来实现。与很多其他的基于RPC的解决方案一样,AndroID使用一种接口定义语言(Interface DeFinition Language,IDL)来公开服务的接口。对于Service的跨进程调用需要通过AIDL来实现,AIDL服务应用非常广泛,如百度地图API中,就提供跨进程的服务,下面我们就看看如何实现AIDL Service ,案例如图:
二、实现AIDL服务的步骤
1. 编写AIDL文件
2. 如果aIDl文件的内容是正确的,会自动生成一个Java接口文件(*.java)。
3. 建立一个服务类(Service的子类)。
4. 实现由aIDl文件生成的Java接口。
5. 在AndroIDManifest.xml文件中配置AIDL服务, 添加<action>标签的androID:name,以便客户端使用隐式Intent启动服务
6、客户端
三、编写AIDL文件
AndroID接口定义语言――LocalService.aIDl
package com.jereh.remote;interface LocalService{ String getLocal();}
IDE会自动生成LocalService.java 文件 如图所示:
四、Remote应用实现
1、编写MyRemoteService
public class MyRemoteService extends Service { @OverrIDe public IBinder onBind(Intent arg0) { // Todo auto-generated method stub return new MyRemoteServiceImpl(); } private class MyRemoteServiceImpl extends LocalService.Stub{ @OverrIDe public String getLocal() throws remoteexception { // Todo auto-generated method stub return "烟台杰瑞教育"; } }}
2、AndroIDManifest.xml配置
<service androID:name="com.jereh.retmote.MyRemoteService" androID:process="remote" > <intent-filter> <action androID:name="com.jereh.remote_service"/> </intent-filter> </service>
五、客户端实现
1、在客户端应用中添加LocalService.aIDl
注意包名要与文件的在服务端定义的包名相同。如图所示:
同样会自动生成LocalService.java 代码
2、MainActivity代码:
public class MainActivity extends Activity { @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); } public voID startService(VIEw vIEw){ Intent service=new Intent("com.jereh.remote_service"); super.bindService(service,conn,Context.BIND_auto_CREATE); } public voID showInfo(VIEw vIEw){ try { local=service.getLocal(); Log.d("jereh",local); Toast.makeText(this,"您已进入"+local,Toast.LENGTH_LONG).show(); } catch (remoteexception e) { // Todo auto-generated catch block e.printstacktrace(); } }private LocalService service;private String local;private ServiceConnection conn=new ServiceConnection() { @OverrIDe public voID onServicedisconnected(Componentname arg0) { } @OverrIDe public voID onServiceConnected(Componentname name,IBinder binder) { // Todo auto-generated method stub // 获取远程Service的onBinder方法返回的对象代理 service=LocalService.Stub.asInterface(binder); } }; @OverrIDe public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main,menu); return true; }}
xml文件:
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:tools="http://schemas.androID.com/tools" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" tools:context=".MainActivity" > <button androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:text="启动远程服务" androID:onClick="startService" /> <button androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:text="查看信息" androID:onClick="showInfo" /></linearLayout>
以上所述就是本文给大家介绍的AndroID应用程序四大组件之使用AIDL如何实现跨进程调用Service,希望大家喜欢。
总结以上是内存溢出为你收集整理的Android应用程序四大组件之使用AIDL如何实现跨进程调用Service全部内容,希望文章能够帮你解决Android应用程序四大组件之使用AIDL如何实现跨进程调用Service所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)