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

时间:2010-11-15 08:56:19

标签: android android-activity

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

finish();
startActivity(newActivity);

startActivity(newActivity);
finish();

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

6 个答案:

答案 0 :(得分:58)

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

答案 1 :(得分:21)

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

答案 2 :(得分:9)

除了Emmanuels的回答:

两种方法startActivityfinish将在结束后调度,因为两者都由UI线程处理。

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:1)

我有类似的问题:

Activity A: singleInstance
Activity B: singleInstance
Activity C: singleInstance

A starts B 
B starts C
C wants to start A:

如果我使用:

finish();
startActivity(A);
有些事情发生了:活动B来到前台而不是A! 但如果我改变这样的代码:

startActivity(A);
finish();

一切似乎都可以,活动A可见。

我不知道是什么问题,但似乎在第一种情况下,C在执行startActivity命令之前完成,以便后栈处理这种情况并显示其最高活动为B! 但在第二种情况下,一切都正常发生。

答案 5 :(得分:0)

我通常在startActivity()之前finish(),因为我认为确保新屏幕在之前发布之前就已经出现了。

我的应用中有一个登录页面。用户成功登录后,登录活动消失,主要活动已启动。它在Android 4中运行良好。

今天我想在Material Design中重写它。但是,我遇到了一个大问题。新的Android工作室使用材料设计创建空白活动,我认为这需要很多资源。同样的过程,但我得到了错误

11-26 18:20:44.450 18397-18397/? I/Choreographer: Skipped 42 frames!  The application may be doing too much work on its main thread.
11-26 18:20:44.485 18397-18408/? I/art: Background partial concurrent mark sweep GC freed 2864(191KB) AllocSpace objects, 4(43MB) LOS objects, 13% free, 100MB/116MB, paused 8.056ms total 39.767ms

它表示我的应用程序在我的手机logcat中启动mainActivity时需要很多资源。我在mainActivity中没有任何内容,只是它是默认的Material Design布局。

我颠倒了订单,现在它在我的手机上正常工作。