Android面试一天意气风发题(Day 19:技士何须为难

作者:ca88编程

Android的费用程度那是杠杠的。有一回顾换单位,面试一家商厦时就被问了Activity运维方式的标题,微胖的面试官问笔者怎么对待二种运营形式,笔者吧嗒吧嗒后,面试官接着问笔者Launcher这几个利用的Home分界面(平日是指Launcher.java)用的是哪一类模试。

Andorid Activity提供了startActivityForResult方法来落实展开另四个页面拿到并回调结果的操作。但在一些意况下,startActivityForResult会冷俊不禁无效的情状。

贰零壹零年从南朝鲜归来时,笔者也是信心爆满,感到三星(Samsung卡塔尔国的Android项目都能做下去了,Android的付出程度这是杠杠的。有一遍想换工作,面试一家公司时就被问了Activity运维格局的标题,微胖的面试官问作者怎么看待多样运营格局,我吧嗒吧嗒后,面试官接着问小编Launcher这些利用的Home分界面(平时是指Launcher.java)用的是哪一类模试。

自己的主题材料归属第风度翩翩种状态,改善后下确有回传结果。

自己自信的答复用singleInstance,要不是面试官早有寻思,猜度他都要被作者的自信弄得要从头可疑人生。笔者的相法很简单,感到它全局唯有三个实例而且应该唯有叁个实例,用singleInstance最佳。

有关书籍中的解释

在《Android群英传》书中有那般生龙活虎段话

"要是在叁个 singleTop 大概 singleInstance 的 ActivityA 中通过 startActivityForResult(State of Qatar方法来运转另三个 ActivityB,那么系统将平昔回到 Activity.RESULT_CANCELED 而不会再去等待再次回到,这是出于系统在 Framework 层做了对那三种运营格局的限量,因为 Android 开拓者感到,差别 Task 之间默许是不可能传递数据的,假诺应当要传递,那则只可以通过 Intent 来绑定数据。 "

先是,表明下那句话适用于Android 5.0(api 21State of Qatar以下的系统,在5.0及以上的连串中不设有该难点。也正是startActivityForResult(卡塔尔国通常干活。

附带结合自身开销测验的实例,开采上面singleTop应该换到singleTask,因为singleTop非亲非故分化的Task,而singleInstance和singleTask都以有关不一样task操作的,singleTop形式下并不曾现身Activity.RESULT_CANCELED的情况。

作者自信的答疑用singleInstance,要不是面试官早有思索,估量她都要被笔者的自信弄得要从头不可思议人生。笔者的相法超轻松,感到它全局独有三个实例并且应当独有三个实例,用singleInstance最棒。

当自家回来查询Launcher的源代码时意识使用的是SingleTask情势。之后就算拿到了offer,但本身仍为那一个主题素材一遍随地挂念。当本身后驶来高通公司做事时,才对Android的三种形式有了越来越尖锐的驾驭。

Android Api关于startActivityForResult的解释

前往查看>>

Launch an activity for which you would like a result when it finished. When this activity exits, your onActivityResult() method will be called with the given requestCode. Using a negative requestCode is the same as calling startActivity(Intent))
(the activity is not launched as a sub-activity).
Note that this method should only be used with Intent protocols that are defined to return a result. In other protocols (such as ACTION_MAIN
or ACTION_VIEW
), you may not get the result when you expect. For example, if the activity you are launching uses FLAG_ACTIVITY_NEW_TASK
, it will not run in your task and thus you will immediately receive a cancel result.

此处表明了startActivityForResult(卡塔尔(قطر‎只适用于Intent显式运行Activity。并且在FLAG_ACTIVITY_NEW_TASK处境下,相当于新建任务栈时来存放在待运转Activity时,startActivityForResult(State of Qatar是行不通的,这里也作证了差别task之间从未意义,经过测验,同样在api 21以下是这样,以上不是这么了,但文书档案上未曾标注。

当小编回到查询Launcher的源代码时意识接纳的是SingleTask形式。之后即使获得了offer,但本身如故为这些难题耿耿于怀。当本人后赶到MediaTek公司职业时,才对Android的几种格局有了更彻底的知情。

Android Activity的加载情势和onActivityResult方法之间的冲突

###想学学越来越多Android知识,只怕获得相关资料请走入Android才具开辟调换2群:862625886。本群可无需付费获取Gradle、翼虎xJava、小程序、Hybrid、移动结构、NDK、React Native、质量优化等才干教程!

测验评释

测验的例子很简短,新建贰个android项目,里面多少个Activity,分别举办设置不一致launchMode进行startActivityForResult(卡塔尔跳转,並且在区别版本机型下测验。以下记录下测验结果

(✅声明在onActivityResult(卡塔尔中健康获取结果;❌表示在onActivityResult(卡塔尔(قطر‎中立时赢得了Activity.RESULT_CANCELED的结果):

startActivityForResult api>=21 api<=19
A(standard)---->B(singleTop)
A(standard)---->B(singleTask)
A(standard)---->B(singleInstance)
A(singleTop)---->B(standard)
A(singleTask)---->B(standard)
A(singleInstance)---->B(standard)

结果评释在21之后,startActivityForResult(卡塔尔(قطر‎做了拍卖,适用于具备的运维形式了。
在事实上开采中需求小心到此地的适配,容错。

面试题:Activity的起步方式(launchMode)有何,有哪些分别?

那应当是后生可畏道很虐人的面试题,很四人都答不上去,很四人常常有就平昔不用过。当自个儿发觉在被自身面试的人中有十分九的比例对它不了然时,我找过一些同事钻探是或不是还会有在面试初级中学毕业生升学考试查这么些主题材料的不可缺少,获得的回答是“程序猿何必为难程序猿”!

因为许多程序猿都以为那几个运营格局还未多大用场。好呢,小编用二个实际中相当的轻便碰着的主题素材来引出它有多么有用。

洋德国人在采取startActivityForResult运营二个Activity时,会意识还还没最先分界面跳转本人的onActivityResult立刻就被施行了,那是为啥呢?

遇到过呢,我见过许三个人为了这一个主题材料无可奈何的。在Activity.java的startActivityForResult方法上看一下法定的印证呢:

 * <p>Note that this method should only be used with Intent protocols * that are defined to return a result. In other protocols (such as * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may * not get the result when you expect. For example, if the activity you * are launching uses the singleTask launch mode, it will not run in your * task and thus you will immediately receive a cancel result.

众多少人现身那些主题素材,确实是因为startActivityForResult运维的Activity设置了singleTask的起步格局。但是,除了这种意况还应该有非常大大概会即时执行吗?

有,并且不菲。如上面表格,侧面第1列代表MainActivity的开发银行方式,第黄金年代行表示SecondActivity(即要startActivityForResult运转的Activity)的起步形式,打叉代表在这里种组合下onActivityResult会被马上调用。

|stand|singleTop| singleTask | singleInstance----|:------:|:----:|:----:|:----:stand|√|√|x| xsingleTop|√|√| x|xsingleTask|√|√| x |xsingleInstance|x|x|x|x

辛亏幸运的是,Android在5.0及其后的本子校勘了那一个范围。也正是说上边x的地点全部制改进成了√。

那正是说在Android 5.0后,还恐怕有那些难题吗?

要么会的。如在Intent中设置了FLAG_ACTIVITY_NEW_TASK再startActivityForResult,即便是标准的运转情势依然会有其生机勃勃主题材料。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Log如下:

07-12 14:21:14.849 20774-20774/net.goeasyway.test I/MainActivity: onCreate07-12 14:21:14.875 20774-20774/net.goeasyway.test I/MainActivity: onResume07-12 14:21:19.995 20774-20774/net.goeasyway.test I/MainActivity: onPause07-12 14:21:19.995 20774-20774/net.goeasyway.test I/MainActivity: onActivityResult requestCode=1 resultCode=007-12 14:21:19.996 20774-20774/net.goeasyway.test I/MainActivity: onResume07-12 14:21:19.996 20774-20774/net.goeasyway.test I/MainActivity: onPause07-12 14:21:20.005 20774-20774/net.goeasyway.test I/SecondActivity: onCreate07-12 14:21:20.018 20774-20774/net.goeasyway.test I/SecondActivity: onResume

只顾:MainActivity的onResume也会被触发。因为onActivityResult被实施时,它会重新获得宗旨。比相当多人也会胜过onResume被平白无故调用,可能正是这种境况。

因此,最后大家开采只假诺不和原先的Activity在同一个Task就能产生这种眼看实施onActivityResult的景况,从原代码也足以获得验证,实际情况查看ActivityStackSupervisor.java。

 if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && r.resultTo.task.stack != null) { // For whatever reason this activity is being launched into a new // task... yet the caller has requested a result back. Well, that // is pretty messed up, so instead immediately send back a cancel // and let the new task continue launched as normal without a // dependency on its originator. Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, r.requestCode, Activity.RESULT_CANCELED, null); r.resultTo = null; }

前言

面试题:Activity的起步方式(launchMode)有何,有何分别?

其他

  • 关于Activity 运转方式与职务栈(task)相关概念

  • Android Developers 关于职务和再次回到栈的表达

  • 《Android群英传》p202

原因

其实上边代码中的越南语注释也说得很了然了,Android认为差异的Task之间对这种必要再次回到结果的运转方式会时有产生一些依赖,所以干脆简单狂暴在跳转前直接重临RESULT_CANCELED结果。

我们依旧用三个例证轻便解释一下,如下图,有三个任务栈,处于前可视状态的是“Back Stack”也叫回来栈,管理后台的是“Background Task”。

图片 1

当“Activity 2”通过startActivityForResult运营“Activity Y”时,“Background Task”中的Activity会被压入重返栈的栈顶。这种景况下,若无在跳转前一贯回到RESULT_CANCELED给“Activity 2”,那么按Back键,应该要跳转到“Activity X”,而按Back键“Activity Y”就能调用finish会发送Result给运转它的“Activity 2”。这时候就很难搞明白,到底是“Activity 2”照旧“Activity X”应该获得宗旨了,会发生局地混乱或是违反的本来面指标意气风发对预定。

前天在调节和测量检验程序时,发今后某朝气蓬勃Activity上点击重临键会调用该Activity的onActivityResult(State of Qatar方法。笔者风华正茂开首用log,后来用断点追踪调节和测量试验半天,照旧百思莫解。因为事情发生从前别的的Activity的LaunchMode都是Normal,未有极其设定,那些Activity由于需求改成了singleTop。直到自个儿鲜明未有三个地方是代码主动触发的,作者才想到了跟Activity的LaunchMode是不是有关。

那应当是风姿罗曼蒂克道很虐人的面试题,非常多人都答不上来,很四人历来就不曾用过。当自家发今后被本身面试的人中有70%的百分比对它不明白时,我找过部分同事商酌是否还恐怕有在面试中考试那个题指标点石成金,得到的答疑是“程序猿何须为难技术员”!

有不当明白的地点还望指正,谢谢啊☺

小结

有关运行情势的标题,其实小编起来写那些种类的稿羊时就想介绍它的,不过开掘它的水达成太深了,必要用相比长的字数本领证秦代楚。今天也只是透过两个其实中轻松遇到的主题素材引起大家的关切,也同一时候引出了“职分”和“重回栈”。

就此,就让程序猿多为难程序猿贰次,进一层的证明请听下回落解。

Even 原创简书账号goeasyway:

探索

因为众多程序猿都认为这几个运行方式尚未多大用途。好啊,笔者用三个其实中比较轻松遭逢的主题素材来引出它有多么有用。

在Google上找寻android activity onactivityresult singTop找到了一些标题。

无数人在使用startActivityForResult运行贰个Activity时,会发觉还未有曾先楚河汉界面跳转自己的onActivityResult马上就被实践了,那是为何吧?

stackoverflow

赶上过吧,我见过许几个人为了那个主题材料无可如何的。在Activity.java的startActivityForResult方法上看一下官方的证实呢:

stackoverflow上某人跟自个儿遇见的标题相通。比如说有一个人开辟者把Activity设置成了singleTask方式,onActivityResult就收不到任何结果了。当她把singleTask形式改回规范方式,又苏醒符合规律。

```

那么些标题下边给出的答案中,有一人说startActivityForResult的文书档案中有那样一句话:

* <p>Note that this method should only be used with Intent protocols

For example, if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result.

* that are defined to return a result. In other protocols (such as

乐趣是:比如说,假诺你正加载的activity使用了singleTask的加载格局,它不会在你的栈中运营,何况那样你会及时收到贰个撤销的结果。

* {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may

即在onActivityResult里即刻获得三个RESULT_CANCEL.

* not get the result when you expect. For example, if the activity you

他还补充说没有很好的补救方法。能够尝试用监听广播的不二等秘书诀。

* are launching uses the singleTask launch mode, it will not run in your

另叁个stackoverflow的标题中,有人间接回复了无法再singleInstance或singleTop方式下行使startActivityForResult(卡塔尔方法,不唯有被选取了,票的数量还不低。

* task and thus you will immediately receive a cancel result.

剩余的四个stackoverflow难题中,有的人讲把singleTask改成singleTop就能够健康,获得高达59票并被选拔。实际上小编用的正是singTop,可是onActivityResult依旧凭空被调用了。

```

startActivityForResult的文档:

本文由ca88发布,转载请注明来源

关键词: ca88网址 程序 程序员 Android