Android:onDestroy()或Application类中的类似方法


75

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


不,请按照以下适当方法进行操作Activity或:Service
Michael Butscher 2013年

13
已经做到了。真讨厌。其实,我扩展应用程序的根本原因是因为使用android服务使我想哭泣……或跳楼:(
也许Julius

Answers:


33

在生产设备上没有针对Application类的此类回调。

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


8

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

通常,您应该立即但异步保存所有更改,以使UI不会挂起。这比保存更改要好得多,onPause()因为如果在暂停应用程序之前发生了不好的事情(应用程序崩溃,用户用完电池),则所有数据都已正确保存。

SharedPreferences已经异步保存更改,因此,如果您使用它,则无需执行其他操作。否则,您可以使用Kotlin协程,或者如果您使用Java,那么好的旧版本AsyncTask很棒。


5

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

@Override
public void onDestroy(){
    super.onDestroy();
    if(isFinishing()){
        //do your stuff here
    }
}

4

首先:我是绝对的初学者

当我的应用退出时,我需要执行一些代码(是的,我在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}
}

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

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

希望对您有所帮助。


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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.