我是新来的Android开发,我仍然无法理解onPause()
和onStop()
中的活性的方法。
在我的应用程序,我有一个静态类,我的名字计数器,它会持续变量的状态在内存中的应用程序。 我的应用程序运行在模拟器罚款。 我是想试验的不同行为onPause()
与onStop()
对于onPause
,我想存储在计数器类成员的值保留,而调用onStop()
我想要的计数器值重置为零。 所以我重写onStop()
和计数器类中的变量设置为零。 然而,在模拟器中,我似乎无法得到暂停状态的应用程序。 在模拟器中,我打开我的应用程序,锻炼吧。 然后我打了仿真器的主页按钮(不后退按钮),并启动其他应用程序,相信这会模仿onPause()
活动。 然而,模拟器似乎并没有兑现这个(我使用的是armeabi V7A仿真器),它似乎总是被调用onStop()
因为我的计数器值都回去为零,按我的倍率, onStop()
这是固有的仿真器或我做错了什么,让我的活动进入暂停状态?
我不知道该模拟器您正在使用测试,但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 -");
}
}
我知道你的问题在6个月前但万一别人绊倒在这个问题上:
是我做错了什么,让我的活动进入暂停状态。
是的,你是。 这个:
我打了仿真器的主页按钮(不后退按钮),并启动其他应用程序,相信这会模仿的onPause()活动。
击中home键确实将调用onPause()
方法,但因为home键,使您的活动不再可见,它就会调用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()
调用的活动将不会被调用,很明显,我刚才谈到的一般情况下在这里。
时的onPause()和的onStop()调用之间的差异可以是相当微妙的。 然而,正如解释在这里 ,在onPause()通常会得到当其他活动发生的焦点(也许作为一个弹出,或透明窗口),而当前的活动仍在运行执行。 如果从应用程序导航完全消失(例如,通过点击home键),活动将不再可见,并且系统可以执行的onStop()。 我只能说可能,因为亚历克斯提到,有一些情况下的onStop在activity被销毁之前不会被调用。
在onPause():
“如果活动已失去焦点,但仍清晰可见(即新的非全尺寸或透明的活动有专注于你的活动之上),则暂停。一个暂停的activity是完全活着(它保持所有的状态和成员信息和连接到窗口管理器)仍然存在,但可以通过系统在极端低内存情况下被杀死“。
的onStop():
“如果活动完全被另一个活动遮蔽,它被停止。它仍然保留所有的状态和成员信息,但是,它不再对用户可见,所以它的窗口被隐藏,它通常会被系统内存时被杀死在其他地方需要“。
从Android的参考活动类措施: http://developer.android.com/reference/android/app/Activity.html
如果您在模拟的Android 4.x的,你可以控制系统如何处理使用设置背景活动 - >开发人员选项 - >不保留活动和后台进程限制。 对于旧版本有一个名为开发工具的应用程序,它包含了相同的设置。 然而,在内存不足的系统可以忽略这些设置和终止应用程序。 增加分配到模拟器可以帮助的内存量。
此外,如果您是从Eclipse的重新启动您的应用,它会杀死摆好终止它先前的过程来代替。
我同意雄鱼!
在onPause():
“如果活动已失去焦点,但仍清晰可见(即新的非全尺寸或透明的活动有专注于你的活动之上),则暂停。一个暂停的activity是完全活着(它保持所有的状态和成员信息和连接到窗口管理器)仍然存在,但可以通过系统在极端低内存情况下被杀死“。
如果你的应用程序交换不按后退(按住HOME),则OS会调用的onPause。 当你的onResume返回到您的活动(请再次按住HOME),你应该把所有的保存私有变量。 但是,你无法控制的用户,对不对?
如果您预计用户将要离开你的应用程序和操作系统调用你的onStop您更好地保存数据,如果你打算继续在你离开过。
我有一个定时器也,我需要保存所经过的时间,所以当用户返回我可以恢复数据。 这里是我的榜样,以节省:
@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”是一个关键的系统,它必须是唯一的。 使用唯一的字符串为每个数据,你想保存。 例如,“startClock”,“ClockTextColor”,等等。