安卓最容易的aidl用两个程序模拟进程通信

安卓最简单的aidl用两个程序模拟进程通信
最近要面试了 没 时间玩了.看了下安卓icp ,说实话一直没过aidl这东东 发现网上帖子好多 下载的却好少 .好吧自己玩了一个 留下做个备注吧.

demo下载链接http://download.csdn.net/detail/yung7086/8584683 

服务端输入文字会保存在sd卡  客户端调用服务的service得到文字返回给客户端

整理下步骤

1创建 aidl接口 文件implaidl.aidl 记得后缀 ,注意不要修饰符哦 我的如此的简单 然后gen目录自动身成了一个对应的包下的implaidl.java文件 里面有个抽象的静态内部类Stub 实现了我们的接口继承了binder 我们发现安卓跨进程常用Ibinder接口,这太深奥我不懂 但是发现onbindservice时候connectionservice也会返回一个ibinder接口,这是安卓内部密码把

package com.yung.aidlclient;
interface implaidl{
	 String getText();
}

看一下工程目录 很简单明了

安卓最容易的aidl用两个程序模拟进程通信安卓最容易的aidl用两个程序模拟进程通信

先做客户端  包含implaidl.aidl的包是从服务端考过来就是了 所以客户端只有一个类展示获取服务端的数据

package com.yung.aidl;

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;

import com.yung.aidlclient.implaidl;
import com.yung.aidlservice.R;

/**
 * 2015年4月11日 15:54:13
 * 
 * @author yung 这是调用者 客户端
 */
public class ShowServiceAct extends Activity {
	TextView tv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mainact);
		tv = ((TextView) findViewById(R.id.textview1));
	}

	@Override
	protected void onResume() {
		super.onResume();
		// 这个action 是服务端的service在manidest注册定义的action 的name
		bindService(new Intent("com.yung.aidl"), new ServiceConnection() {

			@Override
			public void onServiceDisconnected(ComponentName name) {
			}

			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				// TODO Auto-generated method stub
				implaidl i = implaidl.Stub.asInterface(service);
				try {
					tv.setText(i.getText());
				} catch (RemoteException e) {
					e.printStackTrace();
				}
			}
		}, Context.BIND_AUTO_CREATE);
	}
}


 

客户端就一个展示服务端的数据 就可以了 OK

 在看下服务端吧   服务端 提供一个输入的界面 输入的数据 保存在文件提供给客户端


服务端 提供一个输入的界面 输入的数据 保存在文件提供给客户端服务端 提供一个输入的界面 输入的数据 保存在文件提供给客户端服务端 提供一个输入的界面 输入的数据 保存在文件提供给客户端服务端 提供一个输入的界面 输入的数据 保存在文件提供给客户端服务端 提供一个输入的界面 输入的数据 保存在文件提供给客户端服务端 提供一个输入的界面 输入的数据 保存在文件提供给客户端服务端 提供一个输入的界面 输入的数据 保存在文件提供给客户端

package com.yung.aidlclient;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.Toast;

/**服务端 提供一个输入的界面 输入的数据 保存在文件提供给客户端
 * @author yung
 *
 */
public class Main_ShowServiceAct extends Activity implements OnClickListener {
	public EditText ed;
	public static String filePath = "aidl.text";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mainact);
		ed = (EditText) findViewById(R.id.editText1);
	}

	@Override
	public void onClick(View v) {
		saveTextContent(ed.getText().toString() + "  保存时间:"
				+ System.currentTimeMillis());
	}

	private void saveTextContent(String str) {
		File file = new File(getsdpath() + "/" + filePath);
		try {
			if (!file.exists())
				file.createNewFile();
			FileOutputStream out = new FileOutputStream(file);
			out.write(str.getBytes());
			out.flush();
			out.close();
			Toast.makeText(this, "文字保存完毕", Toast.LENGTH_SHORT).show();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static String getsdpath() {
		return Environment.getExternalStorageDirectory().getAbsolutePath();
	}
}

最终要的service出来的  这个service在服务端实现了处理  但是在终端调用


 

package com.yung.aidlclient;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

/**
 * 服务端的服务 提供给客户端调用
 * 
 * @author yung 2015年4月11日 16:18:23
 */
public class AcceptServiceSer extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		return new implaidl.Stub() {

			@Override
			public String getText() throws RemoteException {
				return getTextContent();
			}
		};
	}
//由于
	public String getTextContent() {
		File file = new File(Main_ShowServiceAct.getsdpath() + "/"
				+ Main_ShowServiceAct.filePath);
		FileInputStream read;
		try {
			read = new FileInputStream(file);
			byte[] bys = new byte[read.available()];
			read.read(bys);
			return new String(bys);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

加上服务断的清单文件


 

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity android:name=".Main_ShowServiceAct" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" >
                </action>

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name=".AcceptServiceSer" >
            <intent-filter>
                <action android:name="com.yung.aidl" />
            </intent-filter>
        </service>
    </application>


 没看懂?代码太多   下demo看吧

 http://download.csdn.net/detail/yung7086/8584683