79

我正在扩展 Application 类以使用一些需要上下文的全局变量。我知道 Application 类中有 onCreate() 方法在活动中的任何其他 onCreate() 之前被调用,但我想知道 Application 类中是否有 onDestroy() 或类似方法可以被覆盖,以便我能否在应用程序进程被杀死之前将变量存储在持久内存中,取消注册侦听器并将最后一条消息发送到服务器?如果没有,有没有其他方法可以做到这一点?

4

6 回答 6

33

Application 类的生产设备上没有这样的回调。

您想要做的事情通常应该在更改完成后立即完成,或者在onPause()相应的应用程序组件中完成。

于 2013-06-24T14:52:16.413 回答
8

在android中,没有关闭应用程序的概念。用户离开:这是您将知道的唯一事件(onPause()在活动中)。您应该设计您的应用程序,使其适合此生命周期。

通常,您应该立即异步保存任何更改,以免 UI 挂起。这比保存更改要好得多,onPause()因为如果在应用程序暂停之前发生了一些不好的事情(应用程序崩溃,用户电量耗尽),所有数据都已经正确保存。

SharedPreferences已经异步保存更改,所以如果你使用它,你没有别的事可做。否则,您可以使用 Kotlin 协程,或者如果您使用 Java,旧AsyncTask的很好。

于 2013-06-24T15:04:17.510 回答
5

首先:我是一个绝对的初学者

当我的应用程序退出时,我需要执行一些代码(是的,我在 Android 中不知道这样的事情),这对我来说没问题:

- 我有 MyApplication,它扩展了 Application。作为 MyApplication 的成员,有一个名为 activeActivitiesNumber 的 AtomicInteger 字段和一个公共 getter 方法。

-所有应用程序活动都扩展了MyActivy(它本身扩展了Activity)

-MyActivity 覆盖 onCreate、onResume 和 onStop 方法,并且还有一个受保护的字段:Protected MyAppication mAppState;

a) OnCreate(){
super.onCreate();
mAppState=this.getApplication();...}


b) onResume(){
super.OnResume();
myAppState.getactiveActivitiesNumber().addAndGet(1)
....}

c) onStop(){
super.onStop()

if (myAppStatemyAppState.getactiveActivitiesNumber()..decrementAndGet()<1){
...call exiting code (for instance a public method defined in MyApplication}
}

它有一个问题:如果您启动任何不属于您的应用程序的活动(例如发送电子邮件),它将触发退出方法。

另一个问题(不知道它是否是真实的或理论上的问题)是在某些情况下不能保证 tan 会调用 onStop。

希望这有帮助。

于 2014-05-08T13:10:46.507 回答
5

您可以覆盖which 将是您的应用程序中最后一个关闭的,并检查它是否完成onDestroy()Activity在这种情况下,您的代码将不会在设备旋转时被调用。但是您应该知道,onDestroy()当通过设备主页按钮关闭应用程序时不会调用它。

@Override
public void onDestroy(){
    super.onDestroy();
    if(isFinishing()){
        //do your stuff here
    }
}
于 2018-07-10T11:20:17.840 回答
2

您可以registerActivityLifecycleCallbacks()在 Application 类中使用以下回调(我建议创建一个AppLifecycleCallbacks扩展的类ActivityLifecycleCallbacks):

public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}
于 2018-09-05T17:40:48.113 回答
0

现在可以通过DefaultLifecycleObserver我在下面放一个例子

public class YourApplication extends Application implements DefaultLifecycleObserver {

@Override
public void onCreate() {
//Do your onCreate things
}

@Override
public void onStop(@NonNull @NotNull LifecycleOwner owner) {
    //Do your onStop things
}

@Override
public void onDestroy(@NonNull @NotNull LifecycleOwner owner) {
    //Do your onDestroy things
}
}

您可以检测 onStart onCreate onDestroy onResume onPause onStop 这很好用

于 2022-02-14T15:30:37.510 回答