Android(安卓)finish()自动回调时机,Activity资源释放逻辑放在onDestroy中一定合适吗
首先看Google对finish()的描述,
Call this when your activity is done and should be closed. The
ActivityResult is propagated back to whoever launched you via
onActivityResult().
当activity完成并且应该被关闭的时候,finish()会被回调,在源码中,finish()方法有多处调用,那么在activity的几个生命周期函数中,finish()会在哪个生命周期函数之前或之后呢,下面我们写一段测试代码观察一下。
public class TestActivity extends Activity { private static String TAG = "TestActivity"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); Log.e(TAG, "oncreate time=" + System.currentTimeMillis()); } @Override protected void onResume() { super.onResume(); Log.e(TAG, "onResume time=" + System.currentTimeMillis()); } @Override protected void onStart() { super.onStart(); Log.e(TAG, "onStart time=" + System.currentTimeMillis()); } @Override protected void onPause() { super.onPause(); Log.e(TAG, "onPause time=" + System.currentTimeMillis()); } @Override protected void onStop() { super.onStop(); Log.e(TAG, "onStop time=" + System.currentTimeMillis()); } @Override protected void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestroy time=" + System.currentTimeMillis()); } @Override public void finish() { super.finish(); Log.e(TAG, "finish time=" + System.currentTimeMillis()); }}
代码很简单,操作方法为,进入activity然后按返回键退出,观察log输出发现,finish()在以上几个生命周期函数中,回调的时机位于onResume()和onPause()之间,主动调用finish()方法,顺序同样如此。
下面附上控制台输出:
为什么提一下这个?
因为我们平时习惯性的会把一些资源释放和销毁工作放在onDestroy()中进行,但是onDestroy()并不一定是在activity退出时就回被立刻回调,这样反复进入退出activity就有可能出现一些不可预知的错误,比如实际开发中业务逻辑会很多,就可能导致一些资源还没有被释放的情况被再次使用,所以在这种情况下,应该把这些资源释放销毁的动作放到finish()中进行,从而保证activity被频繁创建时不会出问题。
补充:在阿里发布的的阿里巴巴Android开发手册中也提到了这一点,是一个推荐级的说明:
【推荐】不要在 Activity#onDestroy()内执行释放资源的工作,例如一些工作线程的 销毁和停止,因为 onDestroy()执行的时机可能较晚。可根据实际需要,在 Activity#onPause()/onStop()中结合 isFinishing()的判断来执行。
更多相关文章
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- 一款霸榜 GitHub 的开源 Linux 资源监视器!
- 对hint 设置大小及颜色,可用此方法对字符串设置不同颜色或大小
- android 3.0 ationbar使用总结
- Android(安卓)Stuido无法下载jcenter库
- Android中使用HttpGet和HttpPost访问HTTP资源(一)
- Android(安卓)Studio Gradle构建报错,Error:Execution failed for
- Android(安卓)问题之找不到资源解决办法
- Android(安卓)资源文件的命名规范问题