完成旧活动并开始新活动,反之亦然

Tim*_*ima 68 android android-activity

我知道,我在两个代码片段中都得到了相同的结果

finish();
startActivity(newActivity);
Run Code Online (Sandbox Code Playgroud)

startActivity(newActivity);
finish();
Run Code Online (Sandbox Code Playgroud)

如果他们之间存在很大差异,我想知道你的意见.这个比那个好吗?如果是这样,为什么?

Emm*_*uel 61

当你执行startActivity()时,所做的就是在事件队列中发布你的意图.活动的实际开始在不久的将来异步发生.所以我看不出两者之间有很大的不同.

  • 动画对我来说不同.请参阅下面的答案. (4认同)
  • 应用程序任务行为实际上存在很大差异。我在单独的回答中详细阐述了这个问题。 (3认同)

Mon*_*eur 23

动画明显不同(至少从4.1开始).finish()先调用会开始逐渐淡出第一个活动,您可以在新活动淡入之前简单地看到黑色背景.调用startActivity()首先在旧活动的顶部淡化,黑色背景不可见.


Vit*_*nko 18

根据调用顺序和调用顺序,应用程序任务行为存在重要差异。startActivity()finish()

我所描述的案例仅适用于当前活动(被停止的活动)是任务中唯一的活动的情况。

通常,您会期望系统不会更改起始意图(您为启动另一个活动而创建的意图)。这是不是如果案件finish()被称为在最后调用之前的任务活动startActivity()

在这种情况下,系统组件 ActivityManager 在执行startActivity() 添加 Intent.FLAG_ACTIVITY_NEW_TASK标志到您的意图时。

发生这种情况时,您可能会注意到 LogCat 中的日志条目类似于以下条目:

W/ActivityManager: startActivity 从完成 ActivityRecord{4a19b47 u0 com.foo.bar/com.foo.bar.SplashActivity t4928 f}; 强制 Intent.FLAG_ACTIVITY_NEW_TASK 用于: Intent { cmp=com.foo.bar/com.foo.bar.MainActivity }

这是(在某些情况下)事情可能出错的转折点。

总而言之,如果您想安全一点(而不是体验FLAG_ACTIVITY_NEW_TASK被添加到意图的意外副作用),那么顺序必须是:

  • startActivity()
  • finish()

演示项目

屏幕录像:


sch*_*eld 9

除了Emmanuels的回答:

这两种方法startActivityfinish将被调度之后调用方法的结束,因为两者都是由UI线程处理.


bli*_*uff 6

我会做第二个选择,我不支持从官方来源查找的任何内容,但是,在调用完成之前启动新活动更有意义,通过意图弹出新活动,现在的后台活动可以调用所有清理方法.

如果你反过来这样做,也许意图在清理完成之前没有时间开火.即,活动会在finish()调用后调用startActivity()吗?

我希望你明白我要说的是什么,我会做第二个选择只是为了安全.