Android篇:AIDL的简单使用记录

第一步:新建两个app工程:


如名字所示,testAidlClient 是客户端App,testAidlServer 是服务端App。

testAidlClient 的工程结构如图:


和平常新建工程的不同之处在于,多了一个包:  com.mjw.aidl 

有一个后缀名为aidl的文件 : Imjw.aidl     

Imjw.aidl 文件里面的代码如下

package com.mjw.aidl;

interface Imjw{
	int add (int a,int b );
}

MainActivity.java 里的代码如下

package com.example.testaidl;


import com.mjw.aidl.Imjw;

import android.app.Activity;
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.widget.TextView;


public class MainActivity extends Activity {

	TextView view;
	Imjw imjw;
	
    private ServiceConnection conn=new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub
			imjw=null;
		}
		
		@Override
		public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
			// TODO Auto-generated method stub
			imjw=Imjw.Stub.asInterface(iBinder);
		       try {
		   		view.setText(String.valueOf(imjw.add(2, 4)));
		   	} catch (RemoteException e) {
		   		// TODO Auto-generated catch block
		   		e.printStackTrace();
		   	}
		}
	};

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        view=(TextView) findViewById(R.id.num);
       Intent intent=new Intent();
       intent.setComponent(new ComponentName("com.example.testaidlserver", "com.example.testaidlserver.ImjwService"));
       bindService(intent, conn, Context.BIND_AUTO_CREATE);
    }
}

客户端的代码构建完毕。


testAidlServer 的工程结构如图:


ImjwService 的代码如下所示:

package com.example.testaidlserver;

import com.mjw.aidl.Imjw;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class ImjwService extends Service{

	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return iBinder;
	}
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		Log.d("mjw", "ImjwService onCreate");
	}

	private IBinder iBinder=new Imjw.Stub() {
		
		@Override
		public int add(int a, int b) throws RemoteException {
			// TODO Auto-generated method stub
			
			return a+b;
		}
	};
}

MainActivity 的代码如下所示:

package com.example.testaidlserver;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Intent intent=new Intent("com.example.testaidlserver.ImjwService");
		startService(intent);
	}
}

服务端工程内 Imjw.aidl 文件里面的代码和客户端的一致。

注意:服务端的manifest 的Service 配置需要添加 intent-filter,如下图:


这样,其他外部应用才可以访问服务端的Service 

服务端的代码构建完毕。


第二步:先运行服务端,再运行客户端。

然后,客户端运行的效果无意外如下图所示:


示例完毕。

解释一下:

      在服务端跑起来后,如代码所示,它会开启一个服务,服务里的 iBinder 会在它被客户端绑定的时候,即客户端中MainActivity的 ServiceConnection里的onServiceConnected方法被回调后,客户端那边就可以得到方法里的一个参数 IBinder iBinder。由于iBinder 持有了接口的实例,那么,客户端就可以通过 iBinder 调用 接口的 add 方法,并返回一个计算结果。


猜你喜欢

转载自blog.csdn.net/u014410755/article/details/80035421