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进程间通信实例的主要内容,如果未能解决你的问题,请参考以下文章

Android探索之AIDL实现进程间通信

Android跨进程通信Binder机制与AIDL实例

Android跨进程通信Binder机制与AIDL实例

Android进程间通信-AIDL实现原理

Android Studio创建AIDL文件并实现进程间通讯

学习笔记 Android 使用AIDL实现进程间通信