适当的停止和重新启动你的活动是activity生命周期的重要流程,它确保您的用户知道app时活着的而且不会丢失进程。有一些关键的场景你的activity会停止和重新启动:
1.用户打开最近的app窗口并从你的app切换到另一个app。目前的activity在你app的前台停止状态。如果用户点击图标返回你的app或从最近的app窗口返回,该活动将重新启动。
2.用户在你的app中执行了一个动作开启了一个新的activity,当第二个activity被创建后,当前的activity会停止。如果用户按下后退按钮,第一个activity会重新启动。
3.用户在使用你的app时接到了一个电话
activity类提供了两个生命周期方法,onStop()和onRestart(),它允许您专门处理你的活动如何处理被停止并重新启动。与暂停的状态不同,停止状态保证UI不再是可见的并且用户的焦点与activity是分开的(或一个完全独立的app)。
图解:当用户离开你的activity,系统调用onStop()(1)停止activity。如果用户在你的activity是stopped状态时返回,系统调用onRestart()(2),紧接着onStart()(3)和onResume()(4)。请注意,无论什么情况导致活动停止,系统总是在onStop()之前调用onPause()。
停止你的Activity
当你的activity调用onStop()方法,它不再是可见的而且应该释放几乎所有资源当用户不再使用它。一旦你的活动停止,如果需要恢复系统内存,系统可能会破坏实例。在极端的情况下,系统可能会简单地杀死你的app不通过调用onDestroy()方法,所以重要的是你使用onStop()来释放资源,否则可能会造成内存泄漏。
尽管onPause()方法是在onStop()之前被调用,你也应该使用onStop()来执行更大、更多的CPU密集型关闭操作,如将信息写入数据库中。
举例来说,这里实现了onStop()方法来保存草稿的内容:
@Override
protected void onStop() {
super.onStop(); // Always call the superclass method first
// Save the note‘s current draft, because the activity is stopping
// and we want to be sure the current note progress isn‘t lost.
ContentValues values = new ContentValues();
values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
getContentResolver().update(
mUri, // The URI for the note to update.
values, // The map of column names and new values to apply to them.
null, // No SELECT criteria are used.
null // No WHERE columns are used.
);
}