【技术】【Android】starService和bindService与DOTA2的类比乐趣文

【技术】【Android】starService和bindService与DOTA2的类比乐趣文

理解Android四大组件是端稳Android开发饭碗的基本功,但是餐桌上菜色多了难免会让人注意力分散,尤其是如今轮子当道,大家遇事就github,拿碗的手也越来越松了。 Service隶属四大组件之一,在android四大山门中独占一隅,这个组件用途极广,很多神奇功能都出于此,还是很有必要深究一下的。 我们从startService和bindService讲起。 为了更好的说明问题,我决定拿出DOTA2的两个英雄角色来举例: 敌法师 米波 敌法师是个十分恶心的后期英雄,米波是手残党克星,讲到service,那么这两个英雄的什么地方会有关联呢? 没错,分别是他们的核心装备和技能:分身斧和分则能成 。 我们来看一下技能说明:   幻影斧 用反光材料制成的斧头,能够混淆敌军。 主动:镜像 – 制造2个你的幻象,持续xxx秒(为方便理解,这里可以解读为无限时间)。   分则能成 米波召唤一个不完美的半自主性自身复制体,可以像本体一样获得金钱和经验,并拥有本体的经验和技能。但是,克隆只能使用本体装备的鞋类物品。任何一个克隆死亡都会导致所有米波全体死亡。 对service有研究的兄弟看到这里大概就明白了,没错,重点就在于分身的机制上面。 这里我们开拓一下脑洞,把玩家这一场游戏体验想成app主进程,假设敌法主体为ActivityD(以下简称AD),分身为ServiceD1(SD1)和ServiceD2(SD2); 米波为ActivityM(以下简称AM),分身为SM1、SM2. startService:敌法师 在我们直观感受中只要这盘游戏没完成,AD的死活是与SD1和SD2无关的,他们可以各走各的路线,各干各的活,但是他们的行为都会汇总到玩家的手上。从点击分身斧的那一刻开始,startService()就开始了,存在于一盘游戏中并各不相干。如果想结束service,我们就要主动去调用stopService(),告诉分身们:你们的责任尽到了,可以消失了,等下次开启分身斧的时候再来跟我一起团吧!  start–>stop(SD1,SD2)这样一个控制service的生命周期就结束了。 bindService:米波 米波的情况有点特殊,我们要把米波的存活期作为一个进程来看。好,在米波6级的时候多了一个新同伴:他的分身。这个分身最屌的地方在于他们的生命周期是互相绑定的,并且还能共享一个鞋子(conn可以通过ibinder来反馈service信息),问题在于如果AM死亡,SM1和SM2都会死亡,SM1或者SM2死亡的时候其他不管主体还是分身也会死亡。“分则能成”一旦触发,就相当于bind了一个service,大家生则同衾死同穴。假设AM销毁时没有调用unbindService,会直接导致进程死亡,程序crash( android.app.ServiceConnectionLeaked:that was originally bound here)。     如果米波主体真的不需要分身了,那就得先unbind才能继续:unbind–>stop,此时一个service的操控才算完成(当然游戏里面米波必须死了才能达成这个效果^ ^)。  好,一个新问题,如果我想在某个页面跟一个已启动的service交互,但是又不想他们绑定该怎么办? service running –>bindService(Intent,ServiceConn,flag)–>serviceConn返回参数(AIDL)—>unbindService  —->service