Understanding of isFinishing()
在http://developer.android.com/reference/android/app/Activity.html上阅读关于isFinishing()的Android文档后,我感到困惑。
如果我在onPause()中调用isFinishing(),那么isFinishing()调用的返回值在以下3个场景中会是什么?
由于调用了finish(),活动被终止。
活动不在前台,并且由于内存不足,操作系统正在杀死活动(而不是应用程序)。
活动即将落户。
我确信isFinishing()的结果在方案1中将为真,在方案3中将为false。
情景2怎么样? 在场景2中isFinishing()会返回true还是false?
当操作系统位于前台时,您的活动不会被操作系统杀死。这没有意义。
但是,如果活动因为用户切换到其他应用程序而进入后台,则可能会在处理完onPause()后将其杀死。因此,当用户切换到新应用程序时,您可以获得isFinishing() == false,但随后该应用程序将被终止。
正如文档所说,将所有持久数据保存在onPause()中。 onDestroy()不保证被调用。
(如果Dianne介入并在此纠正我,我不会感到惊讶,顺便说一下。)
-
我编辑了我的问题并指定活动在后台,它被操作系统杀死。在这种情况下,isFinishing()仍然返回false?
-
如果你的应用程序在后台,我很想说这个过程会被杀死,恕不另行通知。
-
是的,Dianne在这里写到:android-developers.blogspot.com/2010/04/… ...引用:"一旦Android确定它需要移除一个进程,它就会残忍地执行此操作,只需强行杀死它。"
-
我的意思是,活动在后台。应用可能在堆栈中有多个活动。 Android可能会杀死不在前台的活动。应用程序本身就在前台。在这种情况下,如果不是前景的活动被OS杀死,那么isFinishing()会返回false吗?
-
Android只会杀死进程。除非你做一些特殊的事情,否则你所有的活动都在同一个过程中运行,因此只能将所有活动一起杀死。无论如何,isFinishing()会告诉您活动是否实际完成。也就是说,用户永远不会返回它。如果它只是因为在后台被杀而不管怎么做都不是这种情况。
-
谢谢hackbod。我不知道Android只会杀死进程而不是个别活动。这个问题困扰了我很长一段时间。谢谢你的澄清。
-
嗨Hackbod,我读了更多Android doc。你确定Android只会杀死进程吗? Android文档说'已停止的活动也仍然存在......但是,它不再对用户可见,并且当其他地方需要内存时,它可能会被系统杀死。 - developer.android.com/guide/topics/fundamentals/activities.html。听起来Android系统可以杀死个别隐形活动。
-
@Kai:嗯...... Dianne WROTE的许多核心Android系统。如果她不知道,没有人知道。此外,这与她所说的一致。当它说"被杀"时,意味着该活动因其托管进程被杀而被杀死。
-
谢谢,EboMike。 Android应该在doc中明确说明Android只会杀死进程,因此我们不会编写能够在堆栈中保留大量活动的应用程序。
-
凯,我不知道这是如何相关的?基本上,您可以根据活动编写代码。他们在onPause中清理。他们恢复onResume的工作。是否(以及如何)杀死他们通常不是一个考虑因素。你重要的是什么情况?
-
我有一个活动,比如活动A,在A.onCreate()中启动活动B.假设堆栈现在有A B,B在顶部。由于A不在前台,因此假设OS由于内存不足而导致A死亡。过了一会儿,B在完成()之后退出。现在A在前台。由于A之前被杀死,它被重新创建。但A.onCreate()再次启动B,这不是我所期望的。我所期待的是,当B完成时,A位于堆栈的顶部。因此,无形A是否可以被杀死有所不同。
-
为什么A在onCreate中启动活动B?这听起来很可疑。此外,如果A由于意图中的某些数据/附加项而启动活动B,它将再次执行此操作。顺便说一句,你应该总是假设一个活动可能因内存不足而被垃圾收集。开发工具中甚至还有一个设置,它会在活动进入后台后立即强制删除活动。
-
A是启动画面活动,B是家庭活动。 A.onCreate()启动一个AsyncTask,它最终将启动B. BTW,dev工具可以强制删除活动后立??即执行活动吗?这真的是我在寻找的东西。
-
我认为它在"开发工具"中。如果你使用模拟器,你会看到它。您可以将开发工具APK移动到手机上。就个人而言,我不喜欢闪屏。但是如果你真的需要使用它们,那么在AsyncTask完成时启动B活动,并在启动活动时调用finish()。显然,如果您的进程被终止,您将再次看到启动屏幕。
-
谢谢。我在模拟器中看到了Dev Tools,并在工具中看到了Immediately destroy activities选项。我会玩它。顺便说一句,关于启动屏幕活动A,我在启动B之后无法完成它,因为我们允许用户稍后通过向A发送具有clear-top标志的意图来重启应用程序。所以我们必须将A保留在堆栈中。
-
活动A有什么作用?!这听起来不对,每当你有一个启动画面活动时,你总是希望在它进入主要活动之后finish()它??。如果您确实要重置并重新显示启动画面,则只需在A上调用startActivity即可。
-
A检查用户是否登录。如果已登录,则A启动B.如果未登录,则A允许用户首先登录。假设当前堆栈是A B C D E F G.在G,我们允许用户首先注销,然后使用clear-top标志向A发送意图,以不同的用户身份登录。因此堆栈只有A,A再次检查登录。登录后,A开始B.
-
除非您希望"后退"按钮触发重新登录,否则您需要调用finish()。如果需要登录,则每个活动都需要检查登录状态,如果用户未登录,则首先启动A.
-
使用堆栈底部的A,更容易清除所有其他活动,比如堆栈中有10个活动,同时具有清除顶部标记的意图。我们检查登录是否已过期activity的onCreate或onResume。如果登录过期,带有clear-top标志的意图将被发送到A以清除A和A之上的所有活动再次出现以进行登录。
-
你如何将数据保存到onPause?你不应该只使用onSaveInstanceState吗?
-
登录成功后,您一定要完成活动A.如果您需要它打开(由于注销),请再次打开它,顶部清晰。如果我登录并按回来再次看到登录屏幕,那就太糟糕了。吻。 @Kai
-
活动是否可能被销毁但是从未有过isFinishing()返回true?
-
我仍然对是否应该使用isFinishing()或isDestroyed()来检查活动是否真的被破坏感到困惑。
如何调用onPause? 2种方式:活动转到后台或我们在某处调用finish()。如果活动转到后台,则isFinishing()为false。如果我们调用finish(),则isFinishing()为true。现在看情况2:由于内存不足,活动不在前台,活动(不是应用程序)被操作系统杀死。一个活动将被杀死,所以它冥想在后台,它被暂停,所以onPause不会被调用。
顺便说一句,活动不能被杀死,只有进程才能被杀死