xml地图|网站地图|网站标签 [设为首页] [加入收藏]

程序员何苦为难程序员,关于startActivityForResult会

来源:http://www.ccidsi.com 作者:集成介绍 人气:188 发布时间:2020-01-16
摘要:Android的开支水准那是杠杠的。有贰遍顾换事业,面试一家集团时就被问了Activity运维格局的主题素材,微胖的面试官问作者怎么对待各样运行情势,作者吧嗒吧嗒后,面试官接着问笔者

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(卡塔尔国方法来运维另贰个 ActivityB,那么系统将直接返回Activity.RESULT_CANCELED 而不会再去等待重回,那是出于系统在 Framework 层做了对那三种运维形式的限量,因为 Android 开辟者以为,不一样 Task 之间暗许是无法传递数据的,若是应当要传递,那则不能不通过 Intent 来绑定数据。 "

第豆蔻梢头,说明下那句话适用于Android 5.0(api 21卡塔尔国以下的种类,在5.0及以上的系统中空中楼阁该难题。约等于startActivityForResult(卡塔尔符合规律专业。

扶助结合自个儿开辟测验的实例,开采上边singleTop应该换到singleTask,因为singleTop非亲非故不相同的Task,而singleInstance和singleTask都以关于分裂task操作的,singleTop格局下并不曾出现Activity.RESULT_CANCELED的情况。

自个儿自信的答复用singleInstance,要不是面试官早有预备,估摸他都要被自个儿的自信弄得要早先狐疑人生。笔者的相法很简短,认为它全局只有一个实例并且应该唯有一个实例,用singleInstance最佳。

当自个儿再次来到查询Launcher的源代码时发掘使用的是SingleTask方式。之后尽管获得了offer,但本人仍为这一个标题心心念念。当本身后驶来MediaTek公司办事时,才对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(卡塔尔是无效的,这里也证实了分裂task之间一直不坚决守护,经过测量检验,肖似在api 21之下是这般,以上不是那般了,但文书档案上还未有注解。

当自家回去查询Launcher的源代码时开采使用的是SingleTask情势。之后尽管得到了offer,但自己照旧为那么些主题素材时刻思念记。当自个儿后驶来德州仪器集团做事时,才对Android的多种方式有了更彻底的理解。

###想学学越多Android知识,大概得到有关资料请步向Android技艺开采沟通2群:862625886。本群可无偿拿到Gradle、奥迪Q5xJava、小程序、Hybrid、移动构造、NDK、React Native、品质优化等技术教程!

测验评释

测试的例证一点也不细略,新建叁个android项目,里面四个Activity,分别进行安装区别launchMode实行startActivityForResult(卡塔尔国跳转,何况在不一致版本机型下测验。以下记录下测量检验结果

(✅表明在onActivityResult(卡塔尔中平常获取结果;❌表示在onActivityResult(State of Qatar中登时赢得了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(State of Qatar做了管理,适用于具备的运转方式了。
在实质上支付中必要留意到此地的适配,容错。

面试题: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

原因

实质上下边代码中的Lithuania语注释也说得很清楚了,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”应该拿到主题了,会爆发一些絮乱或是违反的原有的局地约定。

那应当是生机勃勃道很虐人的面试题,超级多个人都答不上来,比超级多少人常常有就一贯不用过。当作者意识在被自个儿面试的人中有70%的比重对它不驾驭时,小编找过局地同事商议是不是还应该有在面试初级中学毕业生升学考试试那些主题素材的不能缺少,得到的答应是“程序员何须为难技术员”!

有不当精晓的地点还望指正,谢谢啊☺

小结

有关运营格局的难点,其实本人起始写这一个类其他小说时就想介绍它的,不过发掘它的水达成太深了,需求用相比较长的篇幅能力证实清楚。明天也只是通过二个实际上中易于遭遇的标题引起大家的关怀,也同有的时候候引出了“职分”和“重回栈”。

故而,就让程序员多为难程序员一回,进一层的求证请听下回落解。

伊夫n 原创简书账号goeasyway:

因为众多程序员都以为那个运营形式还未有多大用场。好呢,作者用三个实际上中非常轻松遭逢的标题来引出它有多么有用。

超多少人在采取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会被立时调用。

```

standsingleTopsingleTasksingleInstance

stand√√xx

singleTop√√xx

本文由68399皇家赌场发布于集成介绍,转载请注明出处:程序员何苦为难程序员,关于startActivityForResult会

关键词: 68399皇家赌场 程序员 Android and

最火资讯