据官方消息,从2015年年底google不再支持eclipse adt 的更新,为了跟上大家的步伐,小编最近也在尝试使用android studio开发android,但是as有许多使用方式是跟eclipse是不同的,尤其是aidl的使用,这个问题困扰我半天。
一、首先是as中添加了可以直接新建aidl文件的功能,但是也有一点让人头疼的事就是:它不像eclipse一样只要刷新一下就可以在gen目录下自动生成.java文件,as中aidl文件是这样创建的:
1、通过右击app->new->aidl:
2、会在app下生成一个aidl文件(此时aidl下的包名一定要跟manifest.xml下的应用包名一致,默认是一致的):
3、接下来废话不多说,让大家看看我的源码:
MyAIDL.aidl
interface MyAIDL {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
boolean callMethod(int money);
}
MyService
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("aa","onBind");
return new MyBinder();
}
@Override
public void onCreate() {
Log.i("aa","onCreate");
super.onCreate();
}
@Override
public void onDestroy() {
Log.i("aa","onDestroy");
super.onDestroy();
}
public boolean method(int money){
if(money > 5000){
Log.i("aa","pay success");
return true;
}else{
Log.i("aa","pay failed");
return false;
}
}
private class MyBinder extends MyAIDL.Stub {
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
@Override
public boolean callMethod(int money) throws RemoteException {
return method(money);
}
}
}
这样远程服务就完成了,我当时看了许多as中如何使用aidl的博客,好多就此结束了,有的虽然有使用aidl文件,但是没有清楚的将如何在另一个project中使用,下面关键的时候到了:
3、就是在第二个project中用上述(1)方法建立一个aidl文件,但是包名默认与当前项目的报名一致,而且无法修改(这个很蛋疼),于是我的办法就是在将默认的包删除(大家如果有更好的方法,欢迎分享出来),然后自己新建一个包,包名与之前第一个project包名(即包含远程service的project的包名)相同,这样直接将第一个project中的MyService.aidl文件拷贝到该包下即可(因为我的demo中用的名字是MyService.aidl)如图:
4、接下来便是第二个project中的代码了
“`
public class MainActivity extends Activity {
private MyAIDL myAIDL;
private MyConn conn;
private Intent service;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
service = new Intent();
service.setAction("com.xiaohua.android.bb");
service.setPackage("com.xiaohua.android.alipayservice");
}
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
public void click(View v){
switch (v.getId()){
case R.id.start:
startService(service);
break;
case R.id.bind:
conn = new MyConn();
bindService(service, conn,BIND_AUTO_CREATE);
break;
case R.id.call:
try {
if(myAIDL.callMethod(500)){
Toast.makeText(this, "支付成功", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this,"支付失败",Toast.LENGTH_LONG).show();
}
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
private class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myAIDL = MyAIDL.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}