【问题标题】:Android: onDestroy() or similar method in Application classAndroid:应用程序类中的 onDestroy() 或类似方法
【发布时间】:2013-06-24 14:39:41
【问题描述】:

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

【问题讨论】:

  • 不,在ActivityService的适当方法中执行此操作
  • 已经这样做了。真讨厌。实际上,我扩展应用程序的真正原因是因为使用 android 服务让我想哭……或者跳楼:(

标签: android android-lifecycle


【解决方案1】:

在应用程序类的生产设备上没有这样的回调。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果您使用的是whatsapp,那么您知道他们存储了我们最后一次看到的......如果他们不知道应用程序何时关闭,他们怎么能做到这一点。
    【解决方案3】:

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

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

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

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

    -MyActivity 覆盖 onCreate、onResume 和 onStop 方法,并且还有一个受保护的字段: 受保护的 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。

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        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);
        }
        

        【讨论】:

          【解决方案6】:

          现在可以使用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 这很好用

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-04
            相关资源
            最近更新 更多