简单的问题:你能确定finish()
会打电话onDestroy()
吗?我还没有找到任何确认.
我正在开发一个使用蓝牙通信的Android应用程序(使用一个propetary协议),我需要抓住应用程序被杀的那一刻.
我想使用"onDestroy()"方法,但每次应用程序被杀死时都不会调用它.我注意到当我按下后退按钮时会调用它,有时只有当我从任务管理器中删除应用程序时才会调用它.
问题是:我怎样才能抓住应用程序被杀之前的那一刻?
这是我试图使用的代码:
@Override
public void onDestroy() {
sendMessage(msg);
Log.d("SampleApp", "destroy");
super.onDestroy();
}
@Override
public void finish(){
sendMessage(msg);
Log.d("SampleApp", "finish");
super.finish();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,每次我从任务管理器关闭应用程序时都不会调用finish()并且不会调用onDestroy.
我怎么处理这个?
我有一个自定义视图组件.我在片段或活动中使用它.我想知道当它从片段/活动中被销毁时是否有回调?
在我的Activity中,需要在onDestroy()中销毁一些外部事物(服务).但是当配置发生变化时(例如键盘翻转),我不希望这样,因为它会立即恢复.
所以问题是:如何区分onDestroy()是否是由Back-key press或部分配置更改过程引起的?
在@ CommonsWare的回答之后它会很简单)类似于:
@Override
onDestroy() {
if (mIsChangeConfig == true) {
mIsChangeConfig = false:
} else {
stopService();
}
}
@Override
onRetainNonConfigurationInstance() {
mIsChangeConfig = true;
}
Run Code Online (Sandbox Code Playgroud) 我有一个有两个活动的应用程序:"A"和"B".
"A"用于startActivityForResult()
产生"B",即它等待"B".现在,假设"B"在前景中.Android系统可以破坏活动"A"而不会破坏"B"吗?(如果是,那么当"B"完成时,例如在用户输入之后,必须重新创建活动"A"并由Android系统再次放到前台,我需要记住并将"A"恢复到其早期的UI状态. )
请注意,我不是在讨论进程终止(这是不同的情况:如果进程被终止,所有活动都被终止,并且onDestroy()未被调用或无法保证被调用).问题仅在于在等待子活动的结果时是否可以使用onDestroy().
我的应用中有3个片段的活动.当按下第一个按钮时,会在Activity中调用一个方法,该方法执行一些不相关的操作然后调用finish()
.
这会触发onPause()
片段,它会执行更多不相关的内容然后调用super.onPause()
.
然后,应用程序加载它出现的旧Activity(逻辑上跟随视图堆栈),并onDestroyView()
在Fragment上调用时突然崩溃并出现以下异常:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to destroy activity {be.niteowl.niteowl.debug/be.niteowl.niteowl.views.activities.VenueActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2793)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2811)
at android.app.ActivityThread.access$2100(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:972)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at be.niteowl.niteowl.views.activities.TrackFragment.onDestroyView(TrackFragment.java:161)
at android.support.v4.app.Fragment.performDestroyView(Fragment.java:1665)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:980)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) …
Run Code Online (Sandbox Code Playgroud) android ondestroy illegalstateexception android-fragments supportmapfragment
在Angular 2 with Ahead-of-Time(AOT)编译中,我有一个父组件和一个子组件,如下所示:
<div>
<h1>I am a parent</h1>
<myChild *ngIf="showChild"></myChild>
</div>
Run Code Online (Sandbox Code Playgroud)
我知道子模板是动态插入DOM的.我的问题是当"showChild"被评估为false时,Angular究竟会破坏子组件吗?或者Angular会破坏儿童组件吗?这是Angular调用"onDestroy()"方法的时间吗?
这是我之前向朋友发表的声明(如果我错了请纠正我):
当Angular看到DOM中不再需要某个组件时,它将破坏该组件.
更具体地说:在onDestroy中取消任务是否安全?另外,使用onDestroy来取消注册接收器和释放资源是否安全?
我的目的是确保在活动被销毁时取消/销毁我的任务,但不是之前.
的onDestroy():
第一个案例很清楚:我在onDestroy上做了所有的清理,没有出现任何问题.第二种情况虽然有点问题.当Activity被销毁并且onStroy被跳过时(所以我不取消我的任务),是否可能发生任务继续执行,然后完成并尝试更新死活动,以便应用程序崩溃?
我们来到真正的问题:
让我们关注onDestroy(),因为解决方案不在onPause()或onStop()中.参数:
屏幕锁定:设备屏幕锁定时可以调用onPause .这通常就像屏幕保护程序一样,用户立即解锁,因为他站在那里看着屏幕.取消任务并停止我的应用在这种情况下所做的一切只会降低用户体验.我不希望我的应用程序因为偶然的"屏幕保护程序"而窒息而行为不端.
在一个示例应用程序中,我有两个活动屏幕.用户可以在它们之间快速切换.在这个应用程序中,用户倾向于经常快速地切换屏幕.
导航:其中一个屏幕有一个地图,可从系统接收位置更新.它记录了位置(路径)变化的精确图形日志,因此需要不断运行,直到活动关闭.通常我会在onResume和onPause中注册和注销任何接收器.但是,这会使应用程序非常不可用,因为每次用户导航时地图上的更新都会停止.因此,我想取消注册onDestroy中的接收器.
加载列表:第二个屏幕有一个列表,显示来自Web服务的数据.下载数据需要4秒钟.我使用AsyncTask,我知道我应该在必要时取消.它不应该在onPause中取消,因为它应该在用户在屏幕之间切换时继续加载.因此,我想在onDestroy中取消它.
可以有更多的例子.其中一些可能并不完全适合每个人(您甚至可能建议使用服务而不是AsyncTask).但这个想法很重要,所有人都有相同的想法:继续做一些特定于Activity的工作,而Activity 暂停,但是当活动被销毁时,ENSURE停止这样做.(无论我使用的是AsyncTask还是Service,都无关紧要.在任何一种情况下,都应该在Activity被销毁时停止工作.)
PS如果答案是在onDestroy中进行清理是不安全的,这意味着Android框架要求我们停止在onPause中执行的所有操作.然后我就没有看到使用onDestroy的任何理由......
android activity-lifecycle ondestroy android-asynctask android-activity
在我的应用程序中,我使用服务与我们的服务器进行通信.该服务生成多个消息队列线程来处理具有不同优先级的任务.
这个模型已经使用了大约一年没有大问题.但是,最近,我发现onCreate
我的服务类被多次调用了一段时间.onDestroy
从不在两次onCreate
通话之间调用.因此,我没有机会杀死现有的线程.一旦发生此行为,服务内部就会出现重复的线程.
我唯一改变的是运行服务,因为前台服务是用户登录应用程序.我想知道前台服务是否会导致问题.
有任何想法吗?
ondestroy ×10
android ×9
java ×3
android-4.0-ice-cream-sandwich ×1
angular ×1
callback ×1
components ×1
oncreate ×1
parent-child ×1
service ×1
view ×1