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

问题描述 投票:0回答:7

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

android android-lifecycle
7个回答
35
投票

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

你想做的事情通常应该在更改后立即完成,或者在相应应用程序组件的

onPause()
中完成。


8
投票

在android中,没有关闭app的概念。用户刚刚离开:这是您将意识到的唯一事件(

onPause()
在活动中)。你应该设计你的应用程序,使其适合这个生命周期。

通常,您应该立即但异步地保存任何更改,这样 UI 就不会挂起。这比在

onPause()
中保存更改要好得多,因为如果在应用程序暂停之前发生了一些不好的事情(应用程序崩溃,用户电池耗尽),所有数据都已经正确保存。

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


7
投票

您可以覆盖

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

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

5
投票

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

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

-我有扩展应用程序的 MyApplication。作为 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。

希望这有帮助。


2
投票

您可以在具有以下回调的应用程序类中使用

registerActivityLifecycleCallbacks()
(我建议创建一个扩展
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);
}

2
投票

现在可以使用

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 这很好用


0
投票

您可以从

Application
访问
Activity
类中的变量,并从Activity的`onDestroy'中做任何你想做的事

举个例子:

I have cameraExecutor  in Application

class MyApplication : Application() {
    . . .

    // designated executor for camera so UI thread doesn't get blocked
    lateinit var cameraExecutor: ExecutorService
}

And I'm shutting the cameraExecutor from MainActivity 

class MainActivity : ComponentActivity() {
    . . .

    override fun onDestroy() {
        super.onDestroy()
        (this.application as MyApplication).cameraExecutor.shutdown()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.