如何使Android应用程序类重新创建?

时间:2018-12-31 18:28:13

标签: android android-lifecycle android-instant-run

应用程序类:有时是重新创建的

如果我有此权利,请告诉我:启动Android应用程序时,如果有一个扩展android.app.Application的类,则该类将在应用程序启动时创建。但是,如果不使用该应用程序,则可以删除该实例,然后在应用程序再次出现在前台时重新创建该实例。因此,如果有任何实例变量之前已初始化,则不再设置这些变量。

测试应用程序实例的重新创建的健壮性

这个问题是关于如何测试以查看应用程序在重新创建其应用程序类的过程中存活的情况。

我发现我可以进入我的应用程序中的活动,然后“长时间”(以小时为单位)切换到其他应用程序,当我回来时,我看到构造函数在我的类中运行扩展了android.app.Application。问题是我不知道如何强制进行这种重新娱乐,以便我可以高效地进行测试。

从各种活动中重新开始

我将本段添加到原始问题中,以引起对我要进行的测试的注意。我想在上面进行扩展,在这里我说“ ...转到我的应用程序中的活动,然后切换(远离我的应用程序).​​..”。这个想法不是要杀死整个应用程序,然后“从顶部开始” 。用户处于一个活动中,如果Application实例仍然存在,则用户可能会采取一种方式,但是如果Application实例恰好被重新创建,则该用户可能会采用另一种方式。

我并不是要在此问题中解决以下问题(其他地方已介绍)。我要求一个可以在测试中发现类似问题的过程。这样的例子:假设当初始活动运行时,实例变量保存在Application实例中。需要该变量的类可以从Application实例中获取它,但前提是初始活动已经设置了它。现在,操作系统决定清除并重新创建Application实例。当用户将应用程序置于前台时,并且他们正在运行一些随机活动(永远不要通过初始活动的onCreate()进行操作),则实例变量为null。如果该活动的编码正确,那么它不仅会因NPE而崩溃。因此,我正在尝试测试以确保在上述情况下实例变量为null的情况下,应用程序运行良好。我想知道了,但是我想确保,并且无论用户放下手机时正在进行什么活动,我都想确保。

日志是什么样的

如果将应用程序留在子活动之一中,并且应用程序在后台放置了“很长时间”,则OS会破坏某些类实例。当应用程序再次获得关注时,就会有一些创建过程。这是日志的样子。

I/zygote: Late-enabling -Xcheck:jni
V/DaleApplication: DaleApplication constructor.
I/InstantRun: starting instant run server: is main process
V/DaleApplication: DaleApplication onCreate. 
V/DaleDatabaseAdapter: constructor.  
V/DaleListActivity: onCreate() is pulling records from the database.
V/DaleListActivity: >>>>>> Selection Args T

您可以看到我已登录扩展到DaleApplication的{​​{1}}。顺便说一句,我们还看到它还重新创建了数据库适配器,并开始从数据库中提取记录,使用户重新回到销毁所有这些对象之前的位置。

我在这个问题中寻求的答案是我可以执行的某个过程,该过程将允许我按需导致类实例的破坏,从而使我能够验证重建过程是否合理。

我尝试过的东西

尽管我认为杀死整个应用程序是行不通的,但下面的答案建议我尝试一下。但是,当然,我需要设置手机恢复时用户正在使用的活动。

1)我尝试通过adb杀死:

使adb.exe命令行正常工作后,我可以使用android.app.Application然后使用adb shell获取应用程序的pid,其中pidof ..(aid)....(aid)..ApplicationId中。返回了build.gradle

我试图使用13488终止该应用程序,但这没什么用,并且pid仍然存在。我尝试了am kill ..(aid)..,但是说kill 13488。使用Operation not permitted并没有帮助。

编辑:在最终弄清了要与之交互的adb.exe实例之后,我终于使此方法起作用。等效于按下“终止应用程序”按钮[请参见下面的“ 3)”。

2)我尝试在调试工具窗口中点击“红色方块”:

在调试工具窗口中,选择“线程”。那里有一堆东西。我不知道该停止哪个线程来模拟用户将手机放下一个小时。停止-9之后,当我回到手机上的应用程序时,该应用程序启动了主要活动(不同于仅重新创建Application类时,它会启动之前运行的子活动)。

编辑:我认为这不是一个好方法,但是这里可能存在一些不会导致Android开始上一个活动而不是最后一个活动的线程。由于this answer为我 解决了问题,因此未进行更多调查。

3)在Logcat中终止应用程序按钮:

我可以按电话上的“主页”按钮,然后在logcat窗口中单击“红色方块”,但这使我进入了之前活动按下主页按钮。

Terminate App button in Logcat

据我了解,当您从Android Studio(logcat)终止该应用程序时,Android认为当前活动行为不正常,因此,它不是启动它,而是启动了以前的活动。 这与长时间放置手机然后将应用还原到前台的行为不符。

3 个答案:

答案 0 :(得分:0)

  

启动Android应用程序时,如果存在扩展android.app.Application的类,则该类将在应用程序启动时创建

更准确地说,在创建流程时将创建该类的实例。

  

但是,如果不使用该应用程序,则该实例可能会被删除,然后在应用程序再次出现在前台时重新创建。

更准确地说,当您的应用程序不在前台时(有时,即使在前台),您也可以随时终止进程。您的所有对象(包括Application单例)在流程执行时都会消失。您的下一个进程将具有自己的Application单身。

  

因此,如果有任何实例变量之前已初始化,则不再设置这些变量。

这很大程度上取决于它们何时初始化。例如,如果您在onCreate()中初始化它们,它们将在您的Application子类的新实例中再次初始化。

  

如何使Android Application类重新创建?

终止该过程。在Android Studio中,红色正方形“停止”工具栏按钮会执行此操作。您也可以从命令行终止该过程。在许多情况下,将任务从概述屏幕中滑出将终止过程。

答案 1 :(得分:0)

1。)使用HOME按钮将应用置于后台

2。)从Android Studio终止该应用

terminate button

3。)从设备上的启动器重新启动应用程序

享受!

  

但是,如果不使用该应用程序,则该实例可能会被删除,然后在应用程序再次出现在前台时重新创建。

实际上,这与“不被使用”无关,整个过程都被Android终止。

您可以使用onSaveInstanceState(Bundle)持久化整个进程的运行,然后将其恢复到void onCreate(Bundle savedInstanceState)的{​​{1}}。

答案 2 :(得分:-1)

最简单的测试应用程序以查看其在OS删除内容时能否正常运行的方法是将测试设备配置为一开始就不保存内容。这样,每次您按下主页按钮时,操作系统都不会保存任何内容。

如果您进入Settings > System > Developer Options > Apps,应该会看到:

  • 不保留活动 <<<启用
  • 后台进程限制 <<<将此设置为“无后台进程”

Developer options to not save background things