Android开发中,Binder是一种跨进程通信方式,而使用AIDL可以实现Binder的工作。
如何使用它是了解它的第一步,本文章主要记录使用Binder的一些步骤。(代码思路参考《Android开发艺术探索》任玉刚 著)
1.创建两个activity
两个activity(OneActivity、TwoActivity),将OneActivity假设为服务端,TwoActivity假设为客户端,分别运行在不同进程中
在AndroidManifest.xml中,为TwoActivity设置进程,这样两个activity就分别运行在不同的进程中了
2. 创建AIDL文件
在AIDL文件中声明客户端想要调用服务端的方法
interface IInfManager { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ void setName(String name); String getName();}
AIDL文件声明完,activity等文件并不能调用到IInfManager接口,需要在app的build.gradle文件中的android{}中添加
sourceSets{ main{ java.srcDirs = ['src/main/java', 'src/main/aidl'] }}
然后点击sync now按钮,activity文件就可以调用到IInfManager接口了,可以在app\build\generated\source\aidl\debug文件下找到自动生成的IInfManager.java文件。
3.创建Service
Service中创建Binder对象,在onBind方法中返回这个对象,Binder对象中具体实现了IInfManager接口中的方法。Service需要在AndroidManifest.xml中注册。
public class InfManageService extends Service{ private String name; @Override public int onStartCommand(Intent intent, int flags, int startId) { name = intent.getStringExtra("name"); return super.onStartCommand(intent, flags, startId); } @Nullable @Override public IBinder onBind(Intent intent) { return binder; } private Binder binder = new IInfManager.Stub() { @Override public void setName(String mName) throws RemoteException { name = mName; } @Override public String getName() throws RemoteException { return name; } };}
4.服务端OneActivity
OneActivity中设置按钮跳转至TwoActivity,这里为了简单,使用startService可以为InfManageService中name变量初始化"zhangsan"的值。也可以与客户端TwoActivity中一样,绑定service,建立连接,来设置name的值(具体参考下一步客户端的用法)。
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_one); Intent intent = new Intent(OneActivity.this, InfManageService.class); intent.putExtra("name", "zhangsan"); startService(intent); btn_one_gototwo = (Button) findViewById(R.id.btn_one_gototwo); btn_one_gototwo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(OneActivity.this, TwoActivity.class); startActivity(intent); } });}
5.客户端TwoActivity
首先绑定InfManageService服务,建立连接,连接成功后通过返回的IBinder对象可以获得IInfManager接口,可以通过这个接口去使用服务端的方法。
private TextView tv_two_name;private Button btn_two_change; private IInfManager iInfManager; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { iInfManager = IInfManager.Stub.asInterface(service); try { tv_two_name.setText(iInfManager.getName()); Log.i("TwoActivity","first:" + iInfManager.getName()); iInfManager.setName("lisi"); Log.i("TwoActivity","next:" + iInfManager.getName()); }catch (RemoteException e){ } } @Override public void onServiceDisconnected(ComponentName name) { }}; @Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_two); tv_two_name = (TextView) findViewById(R.id.tv_two_name); btn_two_change = (Button) findViewById(R.id.btn_two_change); Intent intent = new Intent(TwoActivity.this, InfManageService.class); bindService(intent, connection, Context.BIND_AUTO_CREATE); btn_two_change.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { iInfManager.setName("wangmazi"); tv_two_name.setText(iInfManager.getName()); } catch (RemoteException e) { e.printStackTrace(); } } });} @Overrideprotected void onDestroy() { super.onDestroy(); unbindService(connection);}
上面代码onServiceConnected方法中,首先在TwoActivity界面中显示了服务端的name变量内容"zhangsan"
推荐阅读:苹果7对比苹果8
-
外媒:《我的世界:地球》比《精灵宝可梦Go》
据外媒报道,日前,外媒slashgear仔细观察了《我的世界》AR游戏--《我的世界:地球(Minecraft Earth)》的首个预发布版。在这家媒体看来,《...
2019-10-09 -
抢先服S17赛季更新,全新主题凤仪之诏来袭,
文|天云解说原创,盗载必究[摘要]相信大家都是知道的,在峡谷之中,抢先服已经是开启S17赛季了,而且一直到S20赛季都将是全新主题凤仪之诏,那么本期笔者就来和大...
2019-10-09 -
王者荣耀返场皮肤预测,可能凤求凰大战至尊宝,
王者荣耀周年庆活动很快就要开始了,按照惯例来说,周年庆返场投票也很快要开始了。所以今天就来猜测一下,都有哪些限定皮肤有可能加入投票池,又有哪些皮肤最可能返场,现...
2019-10-09 -
梦幻西游手游:合宠运气逆天直出12技能吸血鬼
相信在小伙伴们玩《梦幻西游》手游的时候,非常热衷的一件事儿就是合宠,而合宠除了需要运气,两个好的合宠胚子也是非常重要的,拿两个8技能的宠物肯定比两个7技能的宠物...
2019-10-09 -
10.16不删档内测 《三国将无双》战斗特色
由惊蛰世纪发行的动作卡牌战术手游《三国将无双》,即将于10.16日正式开启不删档内测。在全新的战场上,主公们将率领众将带你突破传统卡牌定式,超过百名Q萌武将高爆...
2019-10-09 -
小小“棋盘”却能发挥出巨大能量,战棋游戏让玩
围棋是一种策略型的两人游戏,古代称其为弈,属于琴棋书画四艺之一。作为一款起源于中国的棋类游戏,围棋不仅蕴含着丰富的中华文化,同时强大的策略性也是它的迷人之处。围...
2019-10-09 -
抢先服S17赛季更新:新增4个新生物,风暴龙
[摘要]相信大家都是知道的,抢先服S17赛季已经更新了,那么其中到底新增加了哪些新生物呢?下面笔者就来和大家一起说一下吧!首先第一个就是5分钟刷新的先知主宰了,...
2019-10-09 -
《三位一体4》媒体均分80 经典玩法再度回归
【多玩网10月8日讯】经典作品《三位一体》系列新作《三位一体4》正式解禁,截止撰稿,本作在MC上均分为80分,参与评测的20家媒体中有16家给出了好评,表现令人...
2019-10-09