我是Android开发的新手,我仍然无法理解活动中的onPause()
和onStop()
方法。
在我的应用程序中,我有一个名为Counter的静态类,它将变量的状态保存在应用程序的内存中。我的应用程序在模拟器中运行良好。我试图测试的是onPause()
与onStop()
的差异行为。
对于onPause
,我希望保留Counter类成员中存储的值,而调用onStop()
我希望计数器值重置为零。所以我重写onStop()
并将计数器类中的变量设置为零。但是,在模拟器中,我似乎无法使应用程序处于暂停状态。在模拟器中,我打开我的应用程序,运用它。然后我点击模拟器的主页按钮(而不是后退按钮),启动另一个应用程序,相信这会模仿onPause()
活动。但是,模拟器似乎没有遵守这一点(我使用的是armeabi v7a模拟器),它似乎始终在调用onStop()
,因为我的计数器值全部回到零,根据onStop()
中的覆盖。这是模拟器固有的,还是我做错了让我的活动进入暂停状态?
答案 0 :(得分:22)
我不确定您正在测试哪个模拟器,但onPause
是始终保证在Activity
失去焦点时调用的一种方法(和我说始终因为在某些设备上,特别是那些运行Android 3.2+的设备,onStop
并不总是保证在Activity
被销毁之前被调用。
了解初学者Activity
生命周期的好方法是使用Log
将您的重写方法丢弃。例如:
public class SampleActivity extends Activity {
/**
* A string constant to use in calls to the "log" methods. Its
* value is often given by the name of the class, as this will
* allow you to easily determine where log methods are coming
* from when you analyze your logcat output.
*/
private static final String TAG = "SampleActivity";
/**
* Toggle this boolean constant's value to turn on/off logging
* within the class.
*/
private static final boolean VERBOSE = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (VERBOSE) Log.v(TAG, "+++ ON CREATE +++");
}
@Override
public void onStart() {
super.onStart();
if (VERBOSE) Log.v(TAG, "++ ON START ++");
}
@Override
public void onResume() {
super.onResume();
if (VERBOSE) Log.v(TAG, "+ ON RESUME +");
}
@Override
public void onPause() {
super.onPause();
if (VERBOSE) Log.v(TAG, "- ON PAUSE -");
}
@Override
public void onStop() {
super.onStop();
if (VERBOSE) Log.v(TAG, "-- ON STOP --");
}
@Override
public void onDestroy() {
super.onDestroy();
if (VERBOSE) Log.v(TAG, "- ON DESTROY -");
}
}
答案 1 :(得分:11)
我知道你的问题是6个月前,但万一其他人偶然发现了这个问题:
我做错了什么让我的活动进入暂停状态。
是的,你是。这样:
我点击模拟器的主页按钮(而不是后退按钮),然后 启动另一个应用程序,相信这会模仿onPause() 活性。
点击主页按钮确实会调用onPause()
方法,但由于主页按钮会使您的活动不再可见,因此会调用onStop()
方法(如提到的爱国者和米尔特)。
根据活动开发人员参考(http://developer.android.com/guide/components/activities.html),您可以显示一个对话框或只是让设备进入休眠状态。
或者,您调用的活动只会部分阻碍调用活动。 因此,调用一个活动,创建一个视图大小的窗口:
android:layout_width="100dp"
android:layout_height="100dp"
这不会覆盖整个屏幕,从而使调用活动部分可见,因此只调用调用活动的onPause()
方法。
克隆该活动以使两个视图大小都是“match_parent”而不是“100dp”并调用它,并且将调用调用活动的onPause()
和onStop()
方法,因为调用活动已赢不可见。
当然可以有例外,例如被叫活动导致应用程序崩溃的onCreate()
,onStart()
或onResume()
,然后是onStop()
活动不会被调用,显然,我只是在谈论一般情况。
答案 2 :(得分:3)
调用onPause()和onStop()之间的差异可能非常微妙。但是,正如here所解释的那样,当当前活动仍在运行时,onPause()通常会在另一个活动获得焦点(可能是弹出窗口或透明窗口)时执行。如果您完全离开应用程序(例如,通过点击主页按钮),活动将不再可见,系统可能会执行onStop()。我只是说因为,正如亚历克斯所说,有些情况下,在活动被销毁之前,onStop不会被调用。
答案 3 :(得分:2)
的onPause():
“如果活动失去了焦点但仍然可见(即,新的非全尺寸或透明活动专注于您的活动之上),则会暂停活动。暂停的活动完全存在(它维持所有状态和成员信息并保持附加到窗口管理器),但在极低内存情况下系统可能会将其杀死。“
的onStop():
“如果某个活动被另一个活动完全遮挡,它就会被停止。它仍会保留所有状态和成员信息,但是,它不再对用户可见,因此它的窗口被隐藏,并且通常会被系统在其他地方需要记忆时。“
取自Android参考活动类:http://developer.android.com/reference/android/app/Activity.html
答案 4 :(得分:1)
如果您正在模拟Android 4.x,则可以使用“设置”控制系统处理后台活动的方式 - >开发者选项 - >不要保持活动和后台进程限制。对于旧版本,有一个名为Dev Tools的应用程序包含相同的设置。但是,在内存不足的情况下,系统可以忽略这些设置并终止您的应用程序。增加分配给模拟器的内存量可能会有所帮助。
此外,如果您从Eclipse重新启动应用程序,它将终止上一个进程,而不是正常终止它。
答案 5 :(得分:1)
我同意米尔特!
的onPause():
“如果活动失去了焦点但仍然可见(即,新的非全尺寸或透明活动专注于您的活动之上),则会暂停活动。暂停的活动完全存在(它维持所有状态和成员信息并保持附加到窗口管理器),但在极低内存情况下系统可能会将其杀死。“
如果您在没有按Back(按住HOME)的情况下交换应用程序,则操作系统将调用onPause。当您返回到onResume中的活动(再次按住HOME)时,您应该保留所有私有变量。但你无法控制用户,对吧?!
如果您预计用户将要离开您的应用并且操作系统调用您的onStop,则最好保存数据,如果您打算从中断的位置恢复。
我也有一个Timer,我需要保存已用时间,所以当用户返回时我可以恢复数据。 这是我保存的例子:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate if the process is
// killed and restarted.
savedInstanceState.putLong("elapsedTime", elapsedTime);
// etc.
}
我要恢复的代码:
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
elapsedTime = savedInstanceState.getLong("elapsedTime");
}
将这些方法放在你的课堂里,你很高兴。请记住,在我的情况下,字符串“elapsedTime”是系统的KEY,它必须是唯一的。对要保存的每个数据使用唯一字符串。例如“startClock”,“ClockTextColor”等......