我知道,两个代码段的结果相同
finish();
startActivity(newActivity);
和
startActivity(newActivity);
finish();
我想知道您的意见,如果两者之间有很大差异。这个比那个好吗?如果是这样,为什么?
Answers:
当您执行startActivity()时,所有要做的就是将您的意图发布到事件队列中。活动的实际开始在不久的将来会异步发生。因此,我认为两者之间没有太大区别。
根据和调用的顺序,应用程序任务行为之间存在重要差异。startActivity()
finish()
我描述的情况仅适用于当前活动(正在停止的活动)是任务中唯一的情况。
通常,您希望系统不会更改启动意图(您创建的用于启动另一个活动的意图)。如果不是在调用之前在任务finish()
的最后一个活动上调用,则情况并非如此startActivity()
。
在这种情况下,ActivityManager是系统组件,在执行startActivity()
添加 Intent.FLAG_ACTIVITY_NEW_TASK
标志到您的意图时。
发生这种情况时,可能会注意到LogCat中的日志条目与此类似:
W / ActivityManager:从完成ActivityRecord {4a19b47 u0 com.foo.bar/com.foo.bar.SplashActivity t4928 f}调用的startActivity;强制Intent.FLAG_ACTIVITY_NEW_TASK用于:Intent {cmp = com.foo.bar / com.foo.bar.MainActivity}
这是在某些情况下可能出问题的转折点。
综上所述,如果您想站在安全的一边(而不是FLAG_ACTIVITY_NEW_TASK
被添加到Intent上而不会遇到意外的副作用),那么命令必须是:
startActivity()
finish()
演示项目。
屏幕录像:
我有类似的问题:
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!但在第二种情况下,一切正常。
我通常会startActivity()
先这样做,finish()
因为我认为要确保新屏幕在前一个屏幕出现之前就已出现。
我的应用程序中有一个登录页面。用户成功登录后,登录活动消失,主要活动启动。它在Android 4中正常工作。
今天,我想在材料设计中重写它。但是,我遇到了一个大问题。新的Android Studio使用素材设计来创建空白活动,我认为这需要很多资源。相同的过程,但是我得到了错误
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
它说,mainActivity
在手机日志中启动时,我的应用会占用许多资源。我没有什么,mainActivity
只是它是默认的“材料设计”布局。
我撤消了订单,现在我的手机可以正常运行了。