问题标签 [activity-lifecycle]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1128 浏览

android - 在 onStop() 中释放资源是否安全?

大家好!

我有一个Activity在显示可见布局时分配了相当多的内存。ActivityUI 在很大程度上依赖于这个内存,但是,在用户离开后(通常通过将另一个焦点放在焦点上) ,没有必要保留这些分配Activity

Activity开始分配内存,onResume()一切都很好。不过,让我有点困惑的是解除分配。截至目前,我释放了所有内存,onPause()其中也破坏了相应的 UI 元素。由于Activity在运行时仍然可见,onPause()用户将看到实际的 UI 元素被破坏。这很丑陋,不是我想要的。

所以我的问题:

  1. 释放内存(破坏 UI)是否安全onStop()(根据文档,调用Activity时不可见onStop())?
  2. onStop()可靠吗?
  3. onStop()每次被调用时都保证被调用吗onPause()


编辑:
我觉得我必须更清楚地解释什么让我感到困惑。根据developer.android.com

...对于那些被标记为可终止的方法,在该方法返回后,托管活动的进程可能会在任何时候被系统终止,而无需执行另一行代码...

onStop()方法被标记为“可杀死”。

  • 以上是否意味着(尤其是“ after that method returns”部分)整个范围都onStop()可以保证运行,但是一旦它返回,就不能保证任何运行时(例如,在 中启动的衍生线程onStop())?

  • 或者这是否意味着它onStop()甚至可能在它到达其范围的末尾(作为killed at any time部分)之前被中断?

  • 或者它是否意味着我 - 在我神圣的愚蠢中 - 看不到的其他东西。

0 投票
0 回答
278 浏览

android - 为什么屏幕变暗时onRestoreInstanceState不一致

我将状态数据保存在活动的 onSaveInstanceState 函数中,然后在 onRestoreInstanceState 中恢复该数据。这段代码在 95% 的情况下都能正常工作。

我发现了一个测试用例,导致 Android 从测试到测试产生不同的结果,我不知道为什么。我有最初的 Droid 手机,它有一个滑出式键盘。在我的应用程序中,我执行了 2 个测试用例,这些用例允许我重现由于未调用 onRestoreInstanceState 而未恢复数据的情况。测试几乎相同,但由于我收到的结果略有不同,显然有些不同。

测试用例 1(纵向模式下的电话,键盘输入):

测试用例 2(手机处于横向模式,键盘不在):

测试用例 1 大约 60% 的时间不会恢复数据。测试用例 2 大约 20% 的时间无法恢复数据。对我来说真正突出的唯一区别是在推入或滑出键盘后屏幕被点亮。当那个屏幕亮起时,数据几乎每次都消失了。

如果我调暗屏幕,然后在解锁手机并返回应用程序之前连续滑动键盘大约 10 次,我几乎100% 的时间都会重现这个问题。

在所有成功恢复数据的情况下,调用顺序如下:

在所有未能成功恢复数据的情况下,调用顺序为:

有人能告诉我这里发生了什么吗?为什么我得到不同的结果,执行相同的精确测试?如果我一遍又一遍地运行测试用例#1(或#2),结果永远不会相同。我想了解为什么会发生这种情况,但更重要的是(如果无法给出明确的答案),我只想每次都保存数据,那我该怎么办?我认为将 onRestoreInstanceState 中的代码移动到 onCreate 可以解决问题,但我只是运行了几次测试用例,发现有时传递给 onCreate 的 Bundle 为空,这意味着我的数据没有得到恢复。

如果我不能指望 onCreate 中的 Bundle,也不能指望 onRestoreInstanceState 被调用,那还剩下什么?我唯一的选择是 onResume 吗?这个活动维护了很多数据。我是否应该考虑使用 onRetainNonConfigurationInstance 和 getLastNonConfigurationInstance,在 onResume 中调用 getLastNonConfigurationInstance?以前我使用过这些功能,但由于数据丢失而放弃了它们。我当时不知道为什么,但我怀疑是因为这个确切的问题。但是当我之前使用它们时,我在 onCreate 中调用了 getLastNonConfigurationInstance。如果从 onResume 调用它可能会有所不同/更好?

0 投票
2 回答
1216 浏览

android - 检测Android应用何时进入后台

在我的应用程序中,我需要检测我的应用程序是进入后台还是切换到同一应用程序的另一个活动...我知道我必须使用 onPause 方法...但是如何区分这两种情况?

0 投票
5 回答
734 浏览

android - 需要帮助了解将一段代码放在哪里,onCreate()/OnStart

我试图查看活动生命周期,但我仍然不明白将代码放在哪里。

  1. 在我的onCreate()我得到 GPS 位置。
  2. 稍后在应用程序Camera Intent中调用 ,然后将其关闭。
  3. 再次检索 GPS 位置(我想onCreate()正在再次执行?)

我只希望在应用程序启动时检索一次 GPS 位置。

0 投票
2 回答
2695 浏览

android - Activity 生命周期中的“可见性”指的是什么?onPause vs onStop?

活动生命周期让我头疼。http://developer.android.com/reference/android/app/Activity.html上的文档在描述可见性概念时是如此模棱两可,以至于我无法弄清楚何时onStop()调用 vs onPause()

比较文档中的以下两个语句:

(取自生命周期图的正下方)

和方法可以被多次调用,因为活动对用户可见和隐藏onStart()onStop()

对比

(在带有“可杀死”列的蓝色表中进一步向下)

onPause()当系统即将开始恢复以前的活动时调用。

我从第一句话中了解到的是,在“隐藏”时onStop()调用活动。我猜“隐藏”是指另一项活动已恢复并完全覆盖活动的时间。但是第二个引用然后指出当另一个活动即将开始恢复时调用。那不是也完全隐藏了活动A吗?这两种情况似乎都意味着该活动变得“隐藏”,不是吗?根据我可能的错误解释,并且在相同的情况下被调用。AABAonPause()AonPause()onStop()

该文档似乎在隐藏(onStop()被调用)和部分可见性(onPause()被调用)之间也有所不同。但是什么时候活动仍然是部分可见的?他们是字面意思吗?或者,当一个活动启动一个覆盖整个屏幕的新活动(活动调用 startActivityForResult 并启动一个日期选择器活动)时,它仍然可以被视为“部分可见”吗?活动肯定不会被调用 onStop 吗?它应该随时收到结果!

所以我试图弄清楚我没有得到什么。我知道对 onPause 的调用是有保证的。那将是当活动A失去焦点(设备进入睡眠模式、屏幕锁定等)时,另一个活动B占据前台(活动B可能或可能不是由活动发起A)。但是在什么时候onStop()调用活动A

有多少活动堆积在活动堆栈上的活动 A 上是否重要?是否存在两种不同的“可见性”定义?

对文字墙感到抱歉,但我真的很沮丧:S

所以问题是:究竟在哪些情况下被认为是“隐藏”的活动onStop()才会被调用?

编辑:

我在每个 onX 方法中插入了 Toast 通知,并发现了一些额外的奇怪之处:

  1. 按下 Home 按钮将始终调用 onStop()。但启动应用程序不会调用onRestart(). 相反,它调用onCreate(). 这对我来说似乎很奇怪,但好吧......
  2. 当“USB Mass Storage”活动在主活动之上启动时,onStop()被调用。并且在退出 USB 存储活动时,会调用返回主活动,onRestart()而不是onCreate().
  3. 当设备进入睡眠模式并被唤醒时,活动只经过onPause()andonResume()循环。

最后一点是预料之中的(尽管我无法让它适合生命周期图)。但是 1. 和 2. 怎么了?

在第一点,我期待onRestart()在再次开始活动时接到电话。为什么它取消分配活动并onCreate()改为调用?

并看看第 2 点:根据文档:当“另一个活动出现在活动前面”时,onPaused()应该调用。当 USB 存储活动出现时,不就是这样吗?它没有调用onPause(),它经历了onStop()-OnRestart()循环!显然,文档没有考虑“另一个活动出现在活动之前”的情况。那么究竟发生了什么?

0 投票
4 回答
4839 浏览

android - 使用多个Activity时,Activity进入前台后保留数据如何处理?

目前我对 Android 的生命周期管理有点困惑。Activity 回到前台后,至少有 4 种可能恢复保留的数据:

  • Android 处理:如果内存足够,Android 会在 Activity 重启后存储和恢复重要数据(选中的单选按钮、EditText 的文本、-...等),用户的状态与 Activity 进入之前的状态相同背景。

  • onPause, onResume:覆盖 onPause 并将重要数据保存到数据库或文本文件中,并在下次执行 onResume 时恢复。

  • onSavedInstance(Bundle), onRestoreInstance(Bundle):我可以将数据作为键值对保存到包中,并在执行 onRestoreInstance 后恢复它们。

  • onRetainNonConfigurationInstance()、getLastNonConfigurationInstance():我在一个大对象中处理所有存储问题,并在执行 onCreate 时读取 getLastNonConfigurationInstance()。

尽管哪种方法最好是令人困惑的,但我想它依赖于开发经验来知道何时使用哪种可能性。如果你有一些很好的例子,我会很高兴,但这不是我的问题。我想知道当我有不同的活动并且一个活动在后台暂停时会被Android杀死时如何处理所有这些:

就我而言,我有一个 MainActivity 和一个 MessageActivity。MessageActivity 由一个 ViewSwitcher 组成,该 ViewSwitcher 由两个状态组成。状态一是单选按钮选择列表。状态二是带有两个按钮(发送和中止)的 EditText。当我对每个状态进行猴子测试时,点击 Android 主页按钮,然后重新启动应用程序,当我将处理留给 Android 时,具有正确状态和旧数据的正确 Activity 会进入前台。所以这行得通。
但是当Android在后台销毁MessageActivity时会发生什么:如果我使用Android方式,数据会丢失,我猜MainActivity(而不是MessageActivity->state(1或2))将在我重新启动应用程序后启动(是对吗?)。因此,当我想保留 MessageActivity 的数据时,我必须使用其他三种可能性之一。
当应用程序入口点(因此 MainActivity)与最后一个活动 Activity 不同时,如何巧妙地做到这一点。问题是我必须以 ViewSwitcher 的特殊状态恢复一个特殊的 Activity。我可以在 onStart() 或 onResume() 方法中使用 startActivity(Intent) 从 MainActivity 启动 MessageActivity (因为 MainActivity 可能是入口点),但随后我在生命周期管理中遇到了很多逻辑问题。由于这个事实,我认为这不是正确的方法。

但是,这样做的正确和最佳方法是什么?

0 投票
3 回答
35533 浏览

android - 在Android中销毁布局时覆盖的方法

我有一个扩展 LinearLayout 的自定义组件,当 Layout 被销毁或删除时,我需要执行某些语句。(或即将被删除)

一种方法是检查活动的 onPause() 或 onDestroy() 并调用自定义组件的方法。但我想从活动中消除这种开销。这样自定义组件本身就可以在布局分离时处理。但是当布局被删除时,我会找到合适的方法来覆盖(检测事件)。有没有办法处理这个问题,或者我们需要使用 onPause() 和 onResume() 活动方法?

0 投票
3 回答
2765 浏览

android - 当睡眠在我的视图中启动但不是从主屏幕启动时,为什么我的 android 应用程序调用 onCreate()?

我的应用程序似乎表现完美,除了我不明白一件事。当我按下主页按钮并返回我的应用程序时,之前的状态会恢复(自动)。当我按下主屏幕按钮,然后手机在主屏幕(或除我自己的视图之外的任何其他视图)中进入睡眠状态并返回我的应用程序时,之前的状态会(自动)恢复。

现在,更重要的是,当手机在我的活动处于顶部时进入睡眠状态时,它不会自动恢复以前的状态,但似乎调用 onCreate() 因为开始初始化发生并且我的应用程序的行为就像它刚刚启动一样。

我可以使用 saveInstanceState() 保存实例并调用存储的状态,因此最终问题是可以解决的,但我的问题是:如果 Android 从我的活动而不是从另一个活动进入睡眠状态,为什么 Android 会调用 onCreate()?如果它不调用 onCreate() 发生了什么,为什么我要打扰 saveInstanceState() 因为在每个实例中(除非内存不足),我的应用程序都会将用户返回到他们的最后一个“地标”,除非手机进入睡眠状态从我的活动。

0 投票
1 回答
562 浏览

android - Android 中的 Launcher + singleTask 活动

我在项目中启动活动时遇到问题。

我的“家庭”活动 (H) 允许在其中选择一些服务。假设 S11->...-> S1n 是服务 (S1) 的活动流。H 是我的应用程序的 LAUNCHER 活动。

另外,我需要从 H 切换到另一个应用程序并返回到它。由于我无法更改该应用程序的行为,因此我必须将我的 H 活动声明为“singleTask”,以防止在我的活动堆栈中有多个它的实例。

问题是我的应用程序无法在不删除 H 之后推送的活动的情况下重新启动。例如,如果我有 H-S11-S12,然后按 HOME 并从最近的应用程序菜单重新启动,我会得到 H 作为前台活动。

有任何想法吗?有没有办法让这种组合发挥作用?谢谢!

0 投票
1 回答
235 浏览

android - Android 相机预览仅适用于 3 个手机方向中的 2 个

在我的 Android 应用程序中,我使用 Camera 类从手机的 camrea 中获取快照。我使用 startPreview 启动相机预览,然后使用 takePicture 来抓取图像。我通过添加强制应用程序上的风景

到 AndroidManifest.xml。问题是当我的手机逆时针旋转 90 度时返回我的应用程序。在这种情况下,我看不到预览。它要么是黑色的,要么没有设置为视图。我可以看到 GUI,并且可以正确地从手机中抓取图片。除了看不到预览外,一切正常。当手机处于纵向或手机顺时针旋转 90 度时,不会发生这种情况。

所以简而言之,向左旋转时预览是黑色的,但在其他情况下,预览很好。

我一直在努力解决这个问题,但最后我发现它与手机的方向有关,然后才返回应用程序。

为什么在那个特定的 Orinetation 上看不到我的预览?

编辑:我发现了一些东西。这不是相机本身的错,我放在相机预览上方的 GUI surfaceView 以某种方式隐藏了预览。我将它设置为具有透明背景但它不起作用,我还删除了 onDraw 中的所有绘制调用。但它仍然绘制为黑色。由于某种原因,它不会发生在其他方向上。任何想法?