安卓最简单的aidl用两个程序模拟进程通信

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

demo下载链接 https://download.csdn.net/download/yung7086/8585383

服务端接受用户在文本框输入文字

 客户端调用服务的service得到文字在界面显示

看到网上很多例子都是服务端只有一个service没有界面所以看到效果不好.

整理下步骤

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

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

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

先做客户端  包含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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值