最近要面试了 没 时间玩了.看了下安卓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看吧