AIDL实现Android进程间通信实例
Posted zero9988
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AIDL实现Android进程间通信实例相关的知识,希望对你有一定的参考价值。
实现android进程间通信实例有好几种方法:
1,AIDL
2,Broadcast
3,Intent
4,Content Provider
记录一下AIDL实现Android进程间通信的方式:
Android的AIDL进程间通信实现步骤:
一:创建AIDL服务端:aidl文件,自动生成的接口java文件,服务service
xxxInterface.aidl (远程服务的接口定义)
package com.example.aidltest;
interface IMyAidlInterface
String getValue(); // 为AIDL服务的接口方法,调用AIDL服务的程序需要调用该方法
1,创建一个xxxInterface.aidl文件,文件中是一个接口的形式
2,Eclipse自动完成,根据你的xxxInterface.aidl文件,在gen内生成一个xxxInterface.java文件,真正的创建了xxxInterface中的接口,并创建内部类Stub( extends android.os.Binder)
AIDLtestService.java (远程服务的具体接口方法实现)
package com.example.aidltest;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class AIDLtestService extends Service
//Two choices:
//1:内部类实现,创建一个内部类继承自IMyAidlTest.Stub(自动生成的一个IMyAidlTest内部类)
//2:匿名类实现,创建一个IMyAidlTest.Stub对象,实现接口方法String getValue()
//1,内部类
private MyAIDLimp aidlImp=new MyAIDLimp();
public class MyAIDLimp extends IMyAidlInterface.Stub
@Override
public String getValue() throws RemoteException
// TODO Auto-generated method stub
return "Hello World!";
//2,匿名类
private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub()
public String getValue() throws RemoteException
return "Hello Zero!";
;
;
@Override
public IBinder onBind(Intent arg0)
// TODO Auto-generated method stub
//根据Intent决定是否成功联接,即是否提供服务,如果拒绝服务返回null,接收服务,则返回继承自Stub的实例
//返回这个实现了getValue方法的IMyAidlTest.Stub
//return mBinder
return aidlImp;
3,创建AIDL服务 (AIDLtestService extends Service)
4,在serveice中创建一个xxxInterface.Stub的对象,可以通过内部类或者匿名类实现。这个对象要实现所有具体的接口方法
5,在onbind()中判断是否接收Intent的链接请求,如果接收链接,则return 4中创建的xxxInterface.Stub的对象
AndroidManifest.xml
<service android:name="AIDLtestService">
<intent-filter>
<action android:name="com.example.aidltest.AIDLtestService" />
</intent-filter>
</service>
6,声明这个service,添加intent-filter中的action
二:客户端调用服务
远程的XXXActivity.java
</pre><p><pre name="code" class="java">package com.example.aidltest;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.os.Build;
public class MainActivity extends Activity
private Button btn ;
private TextView tv;
//创建IMyAidlInterface对象
private IMyAidlInterface myAidlInterface=null;
//创建ServiceConnection对象
private ServiceConnection sc=new ServiceConnection()
@Override
public void onServiceDisconnected(ComponentName arg0)
// TODO Auto-generated method stub
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1)
// TODO Auto-generated method stub
myAidlInterface = IMyAidlInterface.Stub.asInterface(arg1);
;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)findViewById(R.id.button1);
tv=(TextView)findViewById(R.id.textView1);
//创建一个服务的intent,启动服务
Intent intent = new Intent(this,AIDLtestService.class);
bindService(intent, sc,Context.BIND_AUTO_CREATE);
btn.setOnClickListener(new OnClickListener()
@Override
public void onClick(View arg0)
// TODO Auto-generated method stub
try
//通过IMyAidlInterface的对象调用远程服务
String s= myAidlInterface.getValue();
System.out.println(s);
tv.setText(s);
catch (RemoteException e)
// TODO Auto-generated catch block
e.printStackTrace();
);
1,创建xxxInterface对象myInterface,创建ServiceConnection对象sc,在sc的onServiceConnected方法中实例化xxxInterface对象。
sc是在之后bindService中使用。
myInterface是之后调用服务进程的对象。
2,创建一个服务的Intent,用这个Intent启动远程服务器的service---AIDLtestService
3,bindService(intent, sc,Context.BIND_AUTO_CREATE);
4,通过myInterface调用远程服务。
以上是关于AIDL实现Android进程间通信实例的主要内容,如果未能解决你的问题,请参考以下文章