适当的停止和重新启动你的活动是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.
);
}
当你停止activity,activity对象是一直驻留在内存中并在activity恢复(resume)时被重新调用。你不需要在初始化组件中创建任何回调方法去恢复之前的状态。该系统还跟踪当前状态的每个视图的布局,因此如果用户输入文本到一个EditText部件,该内容被保留,这样你不需要保存和恢复。
启动和重新启动你的Activity
当你的activity从停止状态回到前台,它接收并调用onRestart()方法。系统也称onStart()被调用时,你的activity变得可见(无论是重启或创建的第一次)。然而onRestart()方法只有当activity从停止状态恢复时会被调用,所以你可以使用它来执行特殊的修复工作前提是activity先前是被停止而不是被销毁。
不常见的是app需要使用onRestart()来恢复activity的状态,所以没有任何指导方法,适用于普通的应用。然而,因为你onStop()方法应该基本上清理你所有activity的资源,你需要在程序重新启动时初始化它们。然而,你还需要在activity第一次被创建时初始化它们(如果activity没有存在的实例)。出于这个原因,你应该把onStart()方法与onStop()方法作为对应物。因为当你创建或者从stopped状态中重新启动时系统都会调用onStart()方法。
例如,因为用户可能已经远离你的app很长一段时间,当用户回来时,onStart()方法是一个好地方去验证所需的系统功能是否是可用的:
@Override
protected void onStart() {
super.onStart(); // Always call the superclass method first
// The activity is either being restarted or started for the first time
// so this is where we should make sure that GPS is enabled
LocationManager locationManager =
(LocationManager) getSystemService(Context.LOCATION_SERVICE);
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!gpsEnabled) {
// Create a dialog here that requests the user to enable GPS, and use an intent
// with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
// to take the user to the Settings screen to enable GPS when they click "OK"
}
}
@Override
protected void onRestart() {
super.onRestart(); // Always call the superclass method first
// Activity being restarted from stopped state
}
当系统销毁你的activity时会调用onDestory()方法。因为你应该在onStop()方法中做大部分系统资源的释放,所以当系统调用onDestory()方法时,你的app应该没有多少事要去做。这种方法是你最后一次的机会去清理可能导致内存泄漏的资源,所以你应该确保额外的线程被销毁并且其他长时间运行的方法比如跟踪操作等也被停止了。