问题标签 [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.
android - 从文件加载 AppState 时显示 ProgressDialog
当我的活动被关闭时,我将应用程序状态数据序列化到文件中,以便在应用程序被系统杀死时重新加载状态。
这种方法(保存和恢复状态)效果很好。但是,有时,当进程被杀死时,根据要加载的数据量,加载状态进程可能至少需要几秒钟才能完成。
因此,我无法在单独的线程上加载状态,因为如果 onLoad 上没有数据,我的活动将崩溃。
所以,我想在加载内容时显示一个进度对话框,但是,确保只有在加载状态过程之后才会调用 Activity 的 onLoad 方法。
有谁知道我怎么能做到这一点?非常感谢。
android - Flurry 设备方向分析,Android
我正在尝试查找有关我的应用程序中的设备方向是否由于活动生命周期中发生的会话日志而导致分析偏斜的信息。
Flurry 中的会话似乎随着活动的开始和结束而开始和结束,并且设备方向有效地导致新的活动生命周期开始,我是否为此收到两组数据?
如果是这样,处理设备方向的正确方法是什么,以便当用户旋转设备时我不会收到倾斜的结果?
android - 为什么应用程序有时会在 killProcess 上重新启动?
通常,通过调用退出我的应用程序:
表现良好,无事故。
但是每隔一段时间,应用程序会再次重新启动(退出后!)。
相关的日志片段显示:
我知道,根据 Android 操作系统的设计,killProcess()不是终止应用程序的正确方法。这是因为killProcess()立即停止该进程,而没有给应用程序任何方式或机会来阻止它或为它做准备。
我知道当我调用finish()时,应用程序堆栈只是被推到后台(并且仍然存在于内存中)。Android 自己决定何时关闭应用程序(即从内存中删除其实例),通常这是在应用程序成为“最旧的未使用时间最长的”时完成的。如果它真的是最后一个,它的行为实际上更可预测。
问题是finish()只会停止并破坏它被调用的活动。它不会停止应用程序或其他活动产生的其他活动。因此,为了便于在开发过程中进行测试和调试,我使用 killProcess()作为一种方便的快捷方式。
但现在我看到这有应用程序有时会在杀死自己后立即重新启动的副作用——所有这些都在 30 毫秒内。
一个简单的解决方案是遍历所有应用程序的活动并完成()它们。但在继续此之前,我很想了解Android 操作系统中是什么让应用程序自己复活。
为什么Android会让一个被杀死的应用程序重新启动?
为什么不一致?(即有时)
android - 从覆盖的 getApplication() 返回共享静态是否安全?
我试图限制一系列应用程序,使用相同的活动(在所有人共享的库项目中),以便一次只能运行一个这样的应用程序。
在我尝试学习如何去做的第一轮尝试中,我了解到:
- android:launchMode="singleTask" 不会成功。
setVisible(true/false)
onResume()/onPause() 分别是判断我的应用程序是否正在运行的最佳方法。但是一旦第二个实例知道第一个实例正在运行,我该怎么办???
因此,我正在考虑通过覆盖Activity.getApplication()并返回共享静态来始终返回相同的实例来欺骗系统:
(这个想法归功于@inazaruk)
但是,就像前面提到的可见性解决方案一样,我现在该怎么办?
系统本身是否使用getApplication()来确定是启动一个新实例还是将其带到堆栈的前面?这安全吗?
如果答案是“否”,我可以调用Activity.finish()来不让第二个活动甚至不开始吗?如果是这样,我在哪里可以做到这一点?
- 就在Activity.onCreate()中?
- 活动.onResume()?
- 我的应用程序()?(构造函数)
- 更好的地方?
android - getRunningAppProcesses() 返回被销毁的进程
我正在使用以下代码段来检查我finish()
编辑的应用程序是否确实不再运行:
令我沮丧的是,我finish()
编辑的一些应用程序(在他们的 Activity.onCreate() 中,甚至在他们有机会启动任何东西之前)仍然列在那里。
为什么?
LogCat 显示这些应用程序onDestroy()
肯定被调用了。
从该列表中真正删除应用程序需要什么?
是killProcess()
我唯一的办法吗?
android - “持久状态”与“当前状态”
试图决定(对于我的应用程序)在onPause()中保存什么以及在onSaveInstanceState()中保存什么,我梳理了整个 SO 以获得提示和明确的指导方针。
如果我理解正确,onSaveInstanceState()最适合保存“运行时更改”或“当前状态”(无论这意味着什么),而onPause()最适合保存“持久状态”(无论这意味着什么)。
我仍然难以确定我的应用程序中的“持久状态”与“当前状态”。例如,虽然用户偏好显然是持久的,onPause()
但当用户更改它们时,Android UI 框架总是自动保存它们时,我是否需要保存它们?
类数据成员是否需要保存在onSaveInstanceState()中?我需要为我的应用程序中的每个课程都这样做吗?
我很困惑。
你能举出真实世界的例子来说明什么必须保存onPause()
和什么必须保存onSaveInstanceState()
吗?除了设备配置更改外,就是这样。
--
在我的问题得到回答后,一些新的见解:
android - 使用广播接收器的一些问题
我想BroadcastReceiver
在我的应用程序中使用AsyncTask
不同的结果指示器Activities
,因此AsyncTasks
也是如此。我认为我的方法有点错误,或者我错过了一些东西。
我在做什么:首先,在onCreate
我将接收器注册为BroadcastReceiver
使用该registerReceiver
方法的过程中。我的接收器看起来像:
在我的应用程序中,我有A 和 B 活动。每个都有不同的接收器,它们从不同的任务中获取消息。顺便说一句,我必须澄清一点,A 活动开始 B 活动。
我在活动 A 中使用接收器,然后活动 A 使用startActivity
. 在活动 B 中,我正在执行一个AsyncTask
并且onPostExecute
我正在发送一个带有 B 活动上下文的广播。但不知何故,A 活动的接收者仍然收到消息。两个接收器具有相同的内容但具有不同的名称。
所以这是我的问题:
- 我应该在方法
unregisterReceiver
上开始新活动时吗?onPause
BroadcastReceiver
我就是这么用的,只打一个电话?每当我发送任何消息时,我都应该一次又一次地注册吗?- 我很确定我没有将任何接收者定义为
Manifest
. 我想这是我做错了。如果这很好,我如何在发送广播时使用 IntentFilter?
如果有不确定的问题,请告诉我。任何有关 BroadcastReceiver 的线索都会很棒而且很受欢迎。
android - 后台 Phonegap 以及 Activity、Process 和 Service 生命周期之间的关系
我有一个 Phonegap 应用程序,我想在后台运行一些程序。也就是说,在 Phonegap Activity 不可见时执行一些逻辑。目前,我无法编写本机服务来运行这些程序,因此我希望 Phonegap Activity 本身充当服务。当然,作为Service运行的逻辑是Javascript,不能作为普通的Android Service来实现。startService
我想到的一个解决方案是通过生成一个“虚拟”或空服务(利用and )将 Phonegap Activity 视为一种伪服务startForeground
。这个想法是 Phonegap Activity 的生命周期将与服务的生命周期相关联,因此将继续在后台执行 Javascript 代码。
不管你是否知道Phonegap,我的问题是:如果我通过在其中生成前台服务来对进程进行优先级排序,这会影响Activity 生命周期吗?服务(及其进程)是否有可能保持活动状态并且主 Activity 从内存中清除?
如果不能保证 Activity 生命周期会受到影响,你能谈谈实践中可能发生的事情吗?
android - 了解为什么在这种情况下会创建 android 活动
我有一个退出方法可以做到这一点:
检查 mRunningActivities 是否正常。它包含我的任务中已创建但未销毁的所有活动。所有活动都继承自:
我注意到对于 Set 中的 2 个活动,该机制运行良好。然而,对于 3 个 Activity,Android 4.0.3 决定它应该启动(创建)Set 中的一个 Activity 的另一个实例(它似乎特别喜欢启动一个特定的 Activity,而不仅仅是任何一个)。他们完成了所有活动(因此 4 个被破坏的活动而不是原来的 3 个)
我确定不是我无意中创建了该活动 - 我的所有 launchActivity 逻辑都通过将 FLAG_ACTIVITY_REORDER_TO_FRONT 标志附加到 Intent 的方法进行过滤,因此我不能以相同的 Activity 类的两个实例结束。必须是重新创建它的操作系统。
也尝试不使用 'android:launchMode="singleTop"' 清单文件属性 - 对于应用程序中的所有活动都是如此。一样。
这里发生了什么 ?上面的 onNewIntent() 方法按预期被命中了 3 次,但在中间,Android 创建了一个新的 Activity 然后也立即终止它。
谢谢
android - prevent task manager from recreating last displayed activity in a task
The scenario is:
launch app, start activity A, navigate to B, then to C press home button. C gets destroyed. Bring up task manager, press on my app's icon. Activity C is being recreated. How can I make this behaviour cease ? What I would like would be to go back to activity A.
The closest I could get to this was by launching activities B,C with Intent.FLAG_ACTIVITY_NO_HISTORY. But the problem with this flag is that it prevents activities B,C from ever being re-created throughout the app's life (they should be creatable once task manager leads user to A).
EDIT: same behaviour observed as in Intent.FLAG_ACTIVITY_NO_HISTORY case if I use this approach instead:
I can not navigate back to activity C once it its onDestroy() has been called once :(
Thanks