Articles of activity lifecycle

活动生命周期

我正在努力了解一个活动的完整生命周期。 所以我在Google上搜索并发现了很多关于活动生命周期的教程,但在所有教程中我都没有在生命周期图中find这些方法: 1. OnContentChanged() 2. OnPostCreate() 3. OnPostResume() 4. OnWindowfocusChanged() 5. OnuserLeaveHint() 6. OnUserInteraction() 7. OnDetachedFromWindow() 我想知道为什么这些方法不包含在android docs的活动生命周期图中。 还有一个问题: 当第一次创建一个活动时,系统调用OnContentChanged()方法作为第一个方法,系统的最后一次调用是一个活动被杀死时的OnDetachedFromWindow()方法,但是android文档说一个活动的整个生命周期发生在OnCreate()之间OnCreate()和OnDestroy() ?

如何完成销毁活动

据我了解,被销毁的活动并不等同于正在完成的活动。 成品 活动将从后台堆栈中删除。 它可以由程序触发(例如通过调用finish() ),或者由用户按下后退键(隐式调用finish() )。 完成一项活动将摧毁它。 摧毁 Android操作系统可能会破坏不可见的活动以恢复内存。 当用户导航回活动时,将重新创建活动。 当用户旋转屏幕时,活动将被销毁并重新创建。 参考:重新创建活动 那么如何完成被破坏的活动呢? finish()方法需要一个Activity对象,但如果活动被销毁,我没有Activity对象 – 我不应该持有对被破坏活动的引用,是吗? 案例分析: 我有一个活动a ,它启动b ,然后启动c (使用Activity.startActivity() ),所以现在后面的堆栈是: a → b → c 在c ,用户填写表单并点击“提交”按钮。 使用AsyncTask向远程服务器发出网络请求。 任务完成后,我会显示一个祝酒词并通过调用c.finish()完成活动。 完善。 现在考虑这种情况: 当异步任务正在进行时,用户切换到另一个应用程序。 然后,由于内存限制,Android OS决定销毁所有3个活动( a , b , c )。 之后,异步任务完成。 现在我该如何完成c ? 我试过的: 调用c.finish() : 不能,因为c被破坏了。 调用b.finishActivity() : 不能,因为b被破坏了。 将Context.startActivity()与FLAG_ACTIVITY_CLEAR_TOP一起使用,以便将b提升到顶部,从而完成c : // […]

释放onPause而不是onDestroy中的资源

这是关于POST-honeycomb (即Android 3.0+),以下引用来自https://developer.android.com/reference/android/app/Activity.html 根据生命周期,onStop和onDestroy是可以杀死的,这意味着: 请注意上表中的“Killable”列 – 对于那些被标记为可填充的方法,在该方法返回之后,托管该活动的进程可能在任何时候被系统杀死而不执行其代码的另一行 换句话说,保证调用onStop(沿着此事件之前发生的其他事件),但在方法返回时,进程可能会死亡,因此无法保证调用onDestroy。 另一句话说: 对于那些未标记为可填充的方法,系统不会从调用方法开始并在返回后继续执行活动的进程。 其次是 因此,活动处于可填充状态,例如,在onPause()之后到onResume()的开始之间。 但这与上述内容不符, 除非这只对应于PRE蜂窝 。 POST蜂窝不是这样,对吗? 所以基本上,onPause和onStop都可以保证被调用。 假设我只在onDestroy中释放资源,那么这可能会导致泄漏,因为可能不会调用onDestroy,对吧? 但是,这个场景(即,没有调用onDestroy)是否会发生在进程被android本身杀死的时候? 是否有任何其他方案导致不调用onDestroy, 从而泄漏资源 。 当Android杀死资源时会破坏资源并且不会发生泄漏 (即使我们没有明确释放资源吗?)这是真的吗? 请提供详细资料,说明这些陈述(1)(2)(3)(4)(5)是否正确。

在onDestroy中进行所有清理是否安全?

更具体地说:在onDestroy中取消任务是否安全? 此外,使用onDestroy来取消注册接收器和释放资源是否安全? 我的目标是确保在活动被销毁时取消/销毁我的任务,但不是之前。 的onDestroy(): 在活动被销毁并且必须释放资源时调用。 当活动被匆忙销毁时(系统资源不足等),不会调用它。 第一个案例很清楚:我在onDestroy上做了所有的清理,没有出现任何问题。 第二种情况虽然有点问题。 当Activity被销毁并且onDestroy被跳过时(所以我不取消我的任务),是否会发生任务继续执行,然后完成并尝试更新死活动,以便应用程序崩溃? 我们来到真正的问题: 当一个Activity被杀死并且跳过onDestroy时,附加到该Activity的所有东西都会被自动销毁吗? ( 只有在一切都将被彻底清除的情况下才会跳过onDestroy吗?任务,注册接收器等) 如果跳过onDestroy这是否意味着整个应用程序被杀死? 让我们关注onDestroy(),因为解决方案不在onPause()或onStop()中。 参数: 可以在销毁Activity时跳过onStop(),就像onDestroy一样 onPause被调用得太早且太频繁,所以它不适合用例。 例子: 屏幕锁定 :设备屏幕锁定时可以调用onPause。 这通常就像屏幕保护程序一样,用户立即解锁,因为他站在那里看着屏幕。 取消任务并停止我的应用在这种情况下所做的一切只会降低用户体验。 我不希望我的应用程序因为偶然的“屏幕保护程序”而窒息而行为不端。 在示例应用程序中,我有两个活动屏幕。 用户可以在它们之间快速切换。 在这个应用程序中,用户倾向于经常快速地切换屏幕。 导航 :其中一个屏幕有一个地图,可从系统接收位置更新。 它记录了位置(路径)变化的精确图形日志,因此需要不断运行,直到活动关闭。 通常我会在onResume和onPause中注册和注销任何接收器。 但是,这会使应用程序非常不可用,因为每次用户导航时地图上的更新都会停止。 因此,我想取消注册onDestroy中的接收器。 加载列表 :第二个屏幕有一个列表,显示来自Web服务的数据。 下载数据需要4秒钟。 我使用AsyncTask,我知道我应该在必要时取消。 它不应该在onPause中取消,因为它应该在用户在屏幕之间切换时继续加载。 因此,我想在onDestroy中取消它。 可以有更多的例子。 其中一些可能并不完全适合每个人(您甚至可能建议使用服务而不是AsyncTask)。 但这个想法很重要,所有人都有相同的想法 :继续做一些特定于Activity的工作,而Activity 暂停 ,但是当活动被销毁时,ENSURE要停止这样做。 (无论我使用的是AsyncTask还是Service,都无关紧要。在任何一种情况下,都应该在Activity被销毁时停止工作。) PS如果答案是在onDestroy中进行清理是不安全的 ,这意味着Android框架要求我们停止在onPause中执行的所有操作。 然后我就没有看到使用onDestroy的任何理由……

“持久状态”与“当前状态”

试图决定(对于我的应用程序)在onPause()中保存什么以及在onSaveInstanceState()中保存什么,我梳理了整个SO以获取提示和明确指南。 如果我理解正确, onSaveInstanceState()最适合保存“运行时更改”或“当前状态”(无论这意味着什么),而onPause()最适合保存“持久状态”(无论这意味着什么)。 我仍然难以确定我的申请中的内容构成“持久状态”与“当前状态”。 例如,虽然用户首选项显然是持久的,但是当用户更改它们时,Android UI框架会自动保存它们时是否需要将它们保存在onPause() ? 类数据成员是否需要保存在onSaveInstanceState()中 ? 我是否需要为我的应用程序中的每个类执行此操作? 我很困惑。 你能带来onPause()必须保存的实际例子以及onSaveInstanceState()必须保存的内容吗? 除了设备配置更改,即。 – 我的问题得到解答后 ,一些新的见解: onSaveInstanceState的Bundle 不会写入任何东西 ,并且它不会以任何方式持久化。 onSaveInstanceState的Bundle数据只会在应用程序关闭之前保存在内存中 。

为什么调用finish()会调用onCreate(),启动一个新的Activity?

(是的,我已经查看了与此问题相关的现有问题。) 我从我的Activity的Up按钮监听器调用finish() 。 但是虽然onDestroy()确实被调用了,但是首先调用onPause()然后,令人惊讶的是, onCreate()会导致实际问题。 为什么通过调用ScanningActivity的finish()方法启动新的ScanningActivity? 我正在记录所有生命周期函数的调用,顺序是这样的: inside onClick() Listener for up button. Inside onPause() Inside onCreate() // this is what’s hosing everything Inside onStart() Inside onResume() Inside onWindowFocusChanged() Inside onStop() Inside onDestroy() 为什么我在调用finish()得到这一系列事件? 这是在onclick监听器(在onCreate()方法中分配finish()中调用finish() ,通知的ScanningActivity代码: @Override public void onCreate(Bundle savedInstanceState) { . . . button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(“ScanningActivity”, […]

在模拟器中模拟杀死活动

我想在模拟器上为我的应用程序测试onSaveInstanceState和onRestoreInstanceState 。 我发现了这个 ,它说我们可以在方向更改期间模拟这个,但是我将一些variables存储在应用程序级别(子类android.app.Application ),因此方向更改不会消除variables。 所以我的问题是,我如何模拟低内存情况,从而杀死我的活动? 希望我已经清楚了。 谢谢

如何在扩展LifecycleActivity的视图中设置SupportActionBar

我有一个扩展AppCompactActivity的Activity,在onCreate方法中,我以通常的方式使用setSupportActionBar方法设置Toolbar : public class StepMasterActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_step_master); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);` } } 但是现在我有一个ViewModel组件,并在作为此活动的子代的片段之间共享数据并管理生命周期,我必须在Activity中获取此组件,因此我将此扩展到LifecycleActivity。 public class StepMasterActivity extends LifecycleActivity { @Override public class StepMasterActivity extends LifecycleActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_step_master); // setToolbar(); SharedViewModel sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel.class); } } 但我注意到LifecycleActivity与AppCompatActivity无关,而FragmentActivity也没有。 public […]

当直接从通知启动活动时,如何构建Android后备栈?

我有两个活动: 活动A – 项目清单 活动B – 项目的详细视图 通常,用户打开应用程序并启动活动A. 用户查看项目列表,单击一个项目,然后启动活动B以显示项目详细信息。 也可以通过单击通知直接启动活动B. 在这种情况下,没有后栈。 如何才能使活动B直接从通知启动时,用户可以单击“返回”按钮并转到活动A?

当活动停止时,Dagger 2保存并恢复状态

我陷入了僵局。 我使用Dagger 2进行dependency injection,但当应用程序进入后台时,我正在丢失状态。 这是情景:应用程序启动并创build依赖关系。 只要应用程序停留在前台,所有的工作都是完美的。 但是,有一种情况下,应用程序必须进入后台。 当它回来时,存储在我的一个注入类中的值将丢失。 对于我的注入类没有自己的依赖,一切似乎恢复正常。 但是,有一个注入类有一个注入依赖,这是不能恢复的类。 以下是我如何设置它: AppComponent.java @Singleton @Component( modules = { AppModule.class } ) public interface AppComponent { SessionKeyExchangerService provideSessionKeyExchangerService(); AESCipherService provideCipherService(); void inject(LoginActivity loginActivity); } AppModule.java @Module public class AppModule { @Provides @Singleton AESCipherService provideCipherService() { return new AESCipherService(); } @Provides @Singleton SessionKeyExchangerService provideSessionKeyExchangerService(AESCipherService service) { return new […]