我正在扩展Application类以处理需要上下文的一些全局变量。我知道Application类中的onCreate()方法在活动中的任何其他onCreate()之前被调用,但我想知道Application类中是否有onDestroy()或类似的方法可以被覆盖这样我就可以将变量存储在持久性内存中,取消注册侦听器并在应用程序进程被杀之前将最后一条消息发送到服务器?如果没有,还有其他办法吗?
答案 0 :(得分:28)
Application类的生产设备上没有这样的回调。
您要执行的操作通常应在更改后立即完成,或者在相应应用组件的onPause()
内完成。
答案 1 :(得分:6)
在android中,没有关闭应用程序的概念。用户离开:这是您将意识到的唯一事件(活动中的onPause()
)。您应该调整您的应用程序设计以适应此生命周期。
你不应该试图找到一种解决方法,它可能会让事情变得更糟:如果用户电量耗尽,或者你的应用程序崩溃了怎么办?所有数据都将丢失。我不知道您正在使用哪种数据,但这通常会导致Google Play评分不佳。即使发生了不好的事情,所有数据都应该已经保存(AsyncTasks
对此非常有用,不要害怕在每次更改时都启动一个以不断保存数据)。
答案 2 :(得分:4)
首先:我是一个绝对的初学者
我需要在我的应用程序退出时执行一些代码(是的,我在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。
希望得到这个帮助。
答案 3 :(得分:1)
您可以在onDestroy()
中覆盖Activity
,该onDestroy()
将是您应用中最后关闭的一个,并检查是否完成。在这种情况下,设备旋转时不会调用您的代码。但是您应该注意,通过设备主页按钮关闭应用程序时,不会调用@Override
public void onDestroy(){
super.onDestroy();
if(isFinishing()){
//do your stuff here
}
}
。
tag
答案 4 :(得分:1)
您可以在Application类中将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);
}
答案 5 :(得分:-2)
你有另一个选择是在你的应用程序的第一个屏幕上覆盖onDestroy(),所以它会在你的进程被杀之前被调用!