简单的android进程间(远程)服务通信示例【AIDL方式】
背景:两个进程间的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类的参数值。
-
package net.blogjava.mobile.aidl;
-
interface IMyService
-
{
-
String getValue();
-
}
2.编写服务的实现类
在这个示例中为MyService.java,内容如下:
-
public class MyService extends Service
-
{
-
-
public class MyServiceImpl extends IMyService.Stub
-
{
-
-
@Override
-
public String getValue() throws RemoteException
-
{
-
// TODO Auto-generated method stub
-
return "Android/OPhone开发讲义";
-
}
-
-
}
-
-
@Override
-
public IBinder onBind(Intent intent)
-
{
-
return new MyServiceImpl();
-
}
-
-
-
}
在清单文件中配置MyService类,代码如下:
-
<service android:name=".MyService">
-
<intent-filter>
-
<action android:name="net.blogjava.mobile.aidl.IService"/>
-
</intent-filter>
-
</service>
3.现在编写一个客户端Activity,来消费这个服务:
-
public class Main extends Activity implements OnClickListener
-
{
-
private IMyService myService = null;
-
private Button btnInvokeAIDLService;
-
private Button btnBindAIDLService;
-
private TextView textView;
-
private ServiceConnection serviceConnection = new ServiceConnection()
-
{
-
-
@Override
-
public void onServiceConnected(ComponentName name, IBinder service)
-
{
-
myService = IMyService.Stub.asInterface(service);
-
btnInvokeAIDLService.setEnabled(true);
-
-
}
-
-
@Override
-
public void onServiceDisconnected(ComponentName name)
-
{
-
// TODO Auto-generated method stub
-
-
}
-
};
-
-
@Override
-
public void onClick(View view)
-
{
-
switch (view.getId())
-
{
-
case R.id.btnBindAIDLService:
-
bindService(new Intent("net.blogjava.mobile.aidl.IMyService"),
-
serviceConnection, Context.BIND_AUTO_CREATE);
-
break;
-
-
case R.id.btnInvokeAIDLService:
-
try
-
{
-
textView.setText(myService.getValue());
-
}
-
catch (Exception e)
-
{
-
-
}
-
break;
-
}
-
-
-
-
}
-
-
@Override
-
public void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
-
btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService);
-
btnInvokeAIDLService.setEnabled(false);
-
textView = (TextView) findViewById(R.id.textview);
-
btnInvokeAIDLService.setOnClickListener(this);
-
btnBindAIDLService.setOnClickListener(this);
-
}
-
}
文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。
原文链接:panda1234lee.blog.csdn.net/article/details/8782215
- 点赞
- 收藏
- 关注作者
评论(0)