Activity中的onPause()和onStop()

我是Android开发新手,还有一点我还不了解活动中的onPause()onStop()方法。

在我的应用程序中,我有一个名为Counter的静态类,它为应用程序保留了内存中的variables状态。 我的应用程序在模拟器中运行良好。 我试图testing的是onPause()onStop()差别行为。

对于onPause ,我希望保留Counter类的成员中存储的值,而调用onStop()我想计数器值重置为零。 所以我重写onStop()并将计数器类中的variables设置为零。 但是,在模拟器中,我似乎无法获得暂停状态的应用程序。 在模拟器中,我打开我的应用程序,运用它。 然后,我点击模拟器的homebutton(不是后退button),并启动另一个应用程序,相信这会模仿onPause()活动。 然而,模拟器似乎并没有荣幸(我正在使用armeabi v7a模拟器),它似乎总是调用onStop()因为我的计数器值都归零,根据我的覆盖onStop() 。 这是模拟器固有的,还是我做错了,让我的活动进入暂停状态?

Solutions Collecting From Web of "Activity中的onPause()和onStop()"

我不确定你正在testing哪个模拟器,但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个月前,但如果有人在这个问题上磕磕绊绊:

我做错了什么让我的活动进入暂停状态。

是的,你是。 这个:

我点击模拟器的主页button(不是后退button),并启动另一个应用程序,相信这会模仿onPause()活动。

点击homebutton确实会调用onPause()方法,但是因为homebutton使得你的活动不再可见,所以它会调用onStop()方法(如上面提到的爱国者&milter)。

根据活动开发人员参考( http://developer.android.com/guide/components/activities.html ),您可以显示一个对话框或简单地让设备进入睡眠状态。

或者,您可以调用一个只能部分阻止呼叫活动的活动。 所以调用一个活动来创build一个大小为视图的窗口:

  android:layout_width="100dp" android:layout_height="100dp" 

它不覆盖整个屏幕,从而使调用活动保持部分可见,因此只调用活动的onPause()方法。

克隆该活动,以便两种视图大小都是“match_parent”而不是“100dp”,并调用它,调用活动的onPause()onStop()方法将被调用,因为调用活动将不可见。

当然,如果被调用的活动导致onCreate()onStart()onResume()的应用程序崩溃,那么调用Activity的onStop()将不会被调用,显然,我只是在这里谈论一般情况。

当onPause()和onStop()被调用时的差异可能非常微妙。 但是,正如这里所解释的,当当前活动仍在运行时,onPause()通常会在另一个活动获得焦点(也许是popup窗口或透明窗口)时执行。 如果完全离开应用程序(例如,通过点击主页button),则活动不再可见,系统可能会执行onStop()。 我只是说可能,因为,正如亚历克斯所说,有一些情况下,在Activity被破坏之前onStop不会被调用。

在onPause():

“如果一个活动失去了焦点,但仍然可见(也就是说,一个新的非全尺寸或透明的活动集中在你的活动之上),它暂停了。暂停的活动是完全活着的(它保持了所有的状态会员信息并保留在窗口pipe理器中),但是在极低的内存情况下可能会被系统杀死。

的onStop():

“如果一个活动被另一个活动完全遮蔽,它就会被停止,它仍然保留着所有的状态和成员信息,但是用户不再可见,所以窗口被隐藏起来,当内存在别处是需要的“。

从android参考活动类采取: http : //developer.android.com/reference/android/app/Activity.html

如果您正在模拟Android 4.x,则可以使用设置 – >开发人员选项 – >不保留活动和后台进程限制来控制系统如何处理后台活动。 对于旧版本,有一个名为开发工具的应用程序,其中包含相同的设置。 但是,在低内存条件下,系统可以忽略这些设置并终止您的应用程序。 增加分配给模拟器的内存量可能会有所帮助。

另外,如果您从Eclipse重新启动您的应用程序,则会终止前一个进程而不是优雅地终止它。

我同意米尔特!

在onPause():

“如果一个活动失去了焦点,但仍然可见(也就是说,一个新的非全尺寸或透明的活动集中在你的活动之上),它暂停了。暂停的活动是完全活着的(它保持了所有的状态会员信息并保留在窗口pipe理器中),但是在极低的内存情况下可能会被系统杀死。

如果您在不按Back的情况下交换应用程序(按住HOME),则操作系统将会打开“暂停”。 当你回到你的活动(再次按住HOME)onResume你应该有所有的私人variables保留。 但是你无法控制用户,对吗?

如果您预计用户将要离开您的应用程序,并且操作系统会调用您的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"); } 

把这些方法放在你的课堂上,你很好。 请记住,在我的情况下string“elapsedTime”是系统的一个关键,它必须是唯一的。 对您想要保存的每一条数据使用唯一的string。 例如“startClock”,“ClockTextColor”等…