android studio 中使用aidl
据官方消息,从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;@Overrideprotected 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");}@Overrideprotected 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) { }}
}
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- android 开机启动加速
- 将apk装入system/app
- Android(安卓)Studio生成aar、jar包及其使用
- Android(安卓)Apk反编译得到Java源代码(爱加密系列教程一)
- android使用AIDL实现跨进程通讯(IPC)