最近发现项目里的一个问题.从 Activity A 进入 Activity B.然后从B返回的时候理论上应该是A onResume之后就会走B的onStop,onDestroy.但是并不是,发现在极端情况下会延迟将近 = null) { //finishes 数组,调用onDestroy activityRemoved |= stack.destroyActivityLocked 接下来就有个疑问了,为啥 onStop,onDestroy 没有立即执行? 必须要等到 MessageQueue 里面没有数据的时候才会去调用 也就是说 onStop,onDestroy 的调用和消息队列有关.如果消息队列很快就空了, onStop,onDestroy 就很快返回 .如果主线程还有消息未处理(比如一直 invalidate )会一直处理,直到超过10s强制调用 现在终于明白为啥 onStop,onDestroy 没有直接返回.那么文章最初的问题又该如何处理呢?
这个时候如果直接调用MyApplication.getInstance().exit() 那么它会是这样执行的 会遍历所以加入的activity执行finish() 而finish执行的时候会执行一次ondestroy ,也就是必须触发这个指令 那么这个代码就是在ondestroy()中执行的, 如果你直接在onkeyDown 也就是通常看见的连接点击退出程序的时候直接调用MyApplication.getInstance ().exit() 就会出错了 当前的你调用的这个类中的ondestroy将不会被执行的 下面是onkeydown和ondestroy的执行顺序: 10-18 21:28:21.471: I/TAG(10652 ): 我是onkeydown 10-18 21:28:23.640: I/TAG(10652): 我是onDestroy finish的执行顺序在他们之前 而我的程序是这样写的,在MainActivity ().exit(); super.onDestroy(); } 注意这个东西只存在于整个程序的主类中
说到Activity的onDestroy,对所有的Android开发者都很熟悉,但是不一定都知道里面存在着一些坑,分享给大家,以后踩中的时候可以应急 用Activity的时候,会发现如下问题: 有时候会发现Activity的onDestroy方法回调比较缓慢(可以达到好几秒钟之后才调用),即使之前使用finish方式关闭Activity也一样 onDestroy回调慢带来什么问题呢? 有可能再次打开Activity的时候,都走完了onCreate,onResume之后上一次的onDestroy方法才被调用,想想如果在onResume和 onDestroy中共同维护了一个变量(isActivityShowing 解决方法与建议 所以建议不要在Activity的onDestroy方法中做有关于数据存储,状态维护的事情,回收资源也最好不要完全依赖这个方法,可以用下面的方式 比较靠谱的解决方式 private if (isFinishing()) { destroy(); } } @Override public void onDestroy
Android在界面跳转的时候,比如从Activity A 跳回 Activity B,并不是先执行A的onDestroy,而是执行完A的onPause之后就立即跳回Activity B里的onResume 在执行了Activity B 的onResume之后一两秒甚至更长一点的时间才执行Activity A里的onDestroy。 这样的处理机制应该是为了能够立即响应用户的操作。 假设在这个时候(Activity A的onDestroy还没被调用,但因为Activity B的onResume已运行完毕,所以可以跟Activity B交互)用户点击视频c,再次进入Activity 所以,对时间要求和Activity是否获取焦点密切相关的操作,不能放在onCreate和onDestroy里,而应该考虑放在onResume和onPause里。
---- 为什么要引进 lifecycle 举一下我们最常用的 MVP 例子,没引进 lifecycle 之前,我们需要在 Activity 或者 Fragment 销毁的时候,即 onDestroy BaseActivity 的时候调用 IBasePresenter 的 onDestroy 方法,这样也确实能做到。 那如果是别的类的呢,比如 MediaCompoment,在 Activity 的时候,我们需要销毁一些资源,按照传统的方法,我们还是需要在 Activity onDestroy 的时候手动调用 onDestroy MediaCompoment 在 Activity ondestroy 的时候,我们需要销毁一些资源,用传统的方法,我们需要在 Activity onDestroy 的时候手动调用 onDestroy 这样会存在一个问题,调用者必须知道比较清楚得知道 MediaCompoment 的设计,否则可能会忘记调用 onDestroy 的方法。
的封装 MVP 中引入 lifecycle,可以自行监听 activity 生命周期变化 ---- LifecycleHandle 的封装 我们平时在使用 handler 的时候,在 activity onDestroy @Override protected void onDestroy() { super.onDestroy(); mHandler.removeCallbacksAndMessages 核心原理其实很简单,内部监听 activity 生命周期的变化,在 onDestroy 的时候移除 message 和 callback。 () { Log.i(TAG, "onDestroy: "); mObserver.onDestroy(mLifecycleOwner); } } FullLifecycleObserver (LifecycleOwner owner) { Log.i(TAG, "onDestroy: owner = " + owner); } }
MediaSelectionFragment.class.getSimpleName()) .commitAllowingStateLoss(); } } @Override protected void onDestroy () { super.onDestroy(); mAlbumCollection.onDestroy(); mSpec.onCheckedListener ; } 2、MediaSelectionFragment public void destroyManagerLoader() { mAlbumMediaCollection.onDestroy (); } 3、AlbumMediaCollection public void onDestroy() { if (mLoaderManager !
通过 startService(Intent intent) 启动 Service 生命周期是这样的: onCreate() 、onStartCommand()、onStart()(已经过时) 、onDestroy 通过 startService 启动 前面说了,通过 startService() 启动 Service 会执行 onCreate()、onStartCommand()、onDestroy() 方法。 调用 stopService 后 Service 只执行一次 onDestroy 方法。 宿主 Activity 退出,不会正常执行 Service 的 onDestroy 方法。 如果 Service 和多个 Activity 绑定,则只有这个 Service 与 所有 Activity 接触绑定后,才会执行 onDestroy 方法。
将 ACE09_1 进行分屏操作,占据屏幕一半,其执行生命周期为:onDestroy -> onCreate -> onStart -> onResume -> onPause; ? 操作屏幕未挡住的下半部分,首次启动初始化 ACE09_2,其执行生命周期为:onCreate -> onStart -> onResume;若 ACE09_2 已启动处于后台,则此时生命周期为:onDestroy 此时两个 Activity 处于一个大于手机屏幕一半,另一个占据另一部分,若调整屏幕范围,使两个 Activity 各占据手机屏幕一半,其执行生命周期为:(onPause ->) onStop -> onDestroy -> ACE09_1 onDestroy -> ACE09_2 onCreate -> onStart -> onResume -> ACE09_1 onCreate -> onStart -> onResume -> ACE09_2 onPause -> onStop -> onDestroy -> onStart -> onResume。
一旦我们退出软件,系统会执行activity的onDestroy()方法,将activity从系统中完全移除,我们通常是在执行了 onPause() and onStop() 之后再调用onDestroy 从activity最初调用onCreate()方法到最终调用onDestroy()方法的整个过程称之为完整生命周期,在onCreate()方法中设置全局状态,在onDestroy()方法中释放所有资源。 ("onDestroy方法被调用"); } } <? 十一.finish()和onDestroy()有什么区别 从上面的代码运行结果来看,控制台上输出了“onDestroy方法被调用”,由此可见,在执行finish()时执行了onDestroy()方法。 实际上他们的区别在于 onDestroy()是生命周期方法,是你的Activity结束的时候由Android系统调用的,你不能直接调用onDestroy()来结束你的Activity,一般做法是调用finish
public class GameMain : MonoBehaviour { LuaSvr Svr; LuaTable lua_Main; LuaFunction lua_OnDestroy } void GameStartUp() { lua_Main = (LuaTable)Svr.start("lua/main"); lua_OnDestroy = ((LuaFunction)lua_Main["OnDestroy"]); lua_Update = ((LuaFunction)lua_Main["Update"]); = lua_OnDestroy) { lua_OnDestroy.call(); } } private void Update( end end function class.OnDestroy( ) callGloablFunc("GOnDestroy") end function class.Update()
); Log.e(TAG, "onRestart: &&&&&&LifeOfFgActivity"); } @Override protected void onDestroy () { super.onDestroy(); Log.e(TAG, "onDestroy: &&&&&&LifeOfFgActivity"); } private super.onDestroyView(); Log.e(TAG, "onDestroyView: ====Fragment1"); } @Override public void onDestroy () { super.onDestroy(); Log.e(TAG, "onDestroy:====Fragment1 "); } @Override () { super.onDestroy(); Log.e(TAG, "onDestroy:>>>>>Fragment2 "); } @Override
2.2 编写MyService代码覆写 onCreate()、onStartCommand()、onDestroy() 函数,这里我们对这些函数分别加上日志;函数 onBind() 暂时不做处理。 () { Log.i(TAG, "onDestroy()"); super.onDestroy(); } ......}Kotlin 代码class MyService () { Log.i(TAG, "onDestroy()") super.onDestroy() } ......}2.3 配置AndroidManifest.xml 4.5 关闭Service点击“stop”按钮,关闭Service,查看日志:onDestroy() 函数是在Service被销毁的时候调用,在Service被销毁掉了的时候,即使再次“关闭”Service ,也不再触发onDestroy() 函数了。
() { super.onDestroy() Log.e("CardFragmentTag", "onDestroy:$tag") } 按Back键回到上一页 会顺序先回调onStop , 再调用onDestroyView与onDestroy E/CardFragmentTag: onStop:f1 E/CardFragmentTag :f3 E/CardFragmentTag: onDestroy:f3 E/CardFragmentTag: onDestroyView:f4 E/CardFragmentTag: onDestroy: f4 E/CardFragmentTag: onDestroyView:f5 E/CardFragmentTag: onDestroy:f5 E/CardFragmentTag: onDestroyView :f6 E/CardFragmentTag: onDestroy:f6 E/CardFragmentTag: onDestroyView:f0 E/CardFragmentTag: onDestroy:
."); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy (); Log.e("HJJ", "Activity &&&& onDestroy..."); } public static class ArrayListFragment extends () { // TODO Auto-generated method stub Log.e("HJJ", "ArrayListFragment **** onDestroy..."); super.onDestroy (10315): ArrayListFragment **** onStop... 01-22 15:32:47.865: E/HJJ(10315): Activity &&&& onStop... onDestroy ): ArrayListFragment **** onDestroyView... 01-22 15:32:47.865: E/HJJ(10315): ArrayListFragment **** onDestroy
protected void onStop() { super.onStop(); Log.i("MainActivity--->","onStop"); } @Override protected void onDestroy () { Log.i("MainActivity--->","onDestroy"); super.onDestroy(); } @Override protected void onRestart() I/MainActivity--->: onResume I/SecondActivity--->: onStop(SecondActivity页面停止) I/SecondActivity--->: onDestroy 为什么MainActivity跳转到另一个页面仅仅只进入了onStop()状态却没有被onDestroy(),在这我们需要说明一个安卓的回退栈的问题。 见谅 当然,活动生命周期的改变并不仅仅由跳转页面所决定,比如手机的配置比较低,高优先级的系统级应用需要内存就会把应用杀死,那毫无疑问 活动将由onResume——>onPause——>onStop——>onDestroy
onResume onWindowFocusChanged: hasFocus: true onWindowFocusChanged: hasFocus: false onPause onStop onDestroy onResume [Life]: onWindowFocusChanged: hasFocus: true // 横屏 [Life]: onPause [Life]: onStop [Life]: onDestroy onResume [Life]: onWindowFocusChanged: hasFocus: true // 竖屏 [Life]: onPause [Life]: onStop [Life]: onDestroy onRestart Act1: onStart Act1: onResume Act1: onWindowFocusChanged: hasFocus: true Act2: onStop Act2: onDestroy Act1: onWindowFocusChanged: hasFocus: false Act1: onPause Act1: onStop Act1: onDestroy 可以看到,启动act2的时候
和activity一样,在onCreate()方法里初始化,在onDestroy()方法里释放资源。 例如,一个背景音乐播放服务可以在onCreate()方法里播放,在onDestroy()方法里停止。 (){ super.onDestroy(); if(sc ! () { super.onDestroy(); if(mediaPlayer ! (){ super.onDestroy(); if(sc !
比如:当Activity的onDestroy()方法被调用后,Activity以及它涉及到的View和相关的Bitmap都应该被回收掉。 () { mInnerClass = null; super.onDestroy(); } Handler 造成的内存泄漏 比如: public class MainActivity @Override protected void onDestroy() { super.onDestroy(); if(handler! 解决此类问题则是需要早Activity中onDestroy去去调用objectAnimator.cancel()来停止动画。 @Override protected void onDestroy() { super.onDestroy(); mAnimator.cancel(); } 系统bug之InputMethodManager
; return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy () { Log.d(TAG, "------>onDestroy()"); super.onDestroy(); } @Override public conn, BIND_AUTO_CREATE); break; case R.id.btn_stop: //建议写在onDestroy BasisService service = new BasisService(); service.show(); } @Override protected void onDestroy () { super.onDestroy(); //解除绑定 unbindService(conn); } //ServiceConnection