我正在扩展 Application 类以使用一些需要上下文的全局变量。我知道 Application 类中有 onCreate() 方法在活动中的任何其他 onCreate() 之前被调用,但我想知道 Application 类中是否有 onDestroy() 或类似方法可以被覆盖,以便我能否在应用程序进程被杀死之前将变量存储在持久内存中,取消注册侦听器并将最后一条消息发送到服务器?如果没有,有没有其他方法可以做到这一点?
6 回答
Application 类的生产设备上没有这样的回调。
您想要做的事情通常应该在更改完成后立即完成,或者在onPause()
相应的应用程序组件中完成。
在android中,没有关闭应用程序的概念。用户离开:这是您将知道的唯一事件(onPause()
在活动中)。您应该设计您的应用程序,使其适合此生命周期。
通常,您应该立即异步保存任何更改,以免 UI 挂起。这比保存更改要好得多,onPause()
因为如果在应用程序暂停之前发生了一些不好的事情(应用程序崩溃,用户电量耗尽),所有数据都已经正确保存。
SharedPreferences
已经异步保存更改,所以如果你使用它,你没有别的事可做。否则,您可以使用 Kotlin 协程,或者如果您使用 Java,旧AsyncTask
的很好。
首先:我是一个绝对的初学者
当我的应用程序退出时,我需要执行一些代码(是的,我在 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。
希望这有帮助。
您可以覆盖which 将是您的应用程序中最后一个关闭的,并检查它是否完成onDestroy()
。Activity
在这种情况下,您的代码将不会在设备旋转时被调用。但是您应该知道,onDestroy()
当通过设备主页按钮关闭应用程序时不会调用它。
@Override
public void onDestroy(){
super.onDestroy();
if(isFinishing()){
//do your stuff here
}
}
您可以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);
}
现在可以通过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 这很好用