Activity中的onPause()和onStop()

Ste*_*iov 19 android android-emulator onpause

我是Android开发的新手,我仍然无法理解活动中的方法onPause()onStop()方法.

在我的应用程序中,我有一个静态类,我将其命名为Counter,它将变量的状态保存在应用程序的内存中.我的应用程序在模拟器中运行良好.我是想试验的不同行为onPause()onStop().

因为onPause,我希望保留Counter类成员中存储的值,而调用onStop()我希望计数器值重置为零.所以我重写onStop()并将计数器类中的变量设置为零.但是,在模拟器中,我似乎无法使应用程序处于暂停状态.在模拟器中,我打开我的应用程序,运用它.然后我点击模拟器的主页按钮(而不是后退按钮),启动另一个应用程序,相信这会模仿onPause()活动.但是,模拟器似乎没有遵守这一点(我使用的是armeabi v7a模拟器),它似乎总是在调用,onStop()因为我的计数器值全部回到零,按照我的覆盖onStop().这是模拟器固有的,还是我做错了让我的活动进入暂停状态?

Ale*_*ood 23

我不确定你正在测试哪个模拟器,但是当你失去焦点时onPause,总是保证会调用一种方法Activity(我总是说因为在某些设备上,特别是那些运行Android 3.2+的设备,onStop并不总是保证在Activity被摧毁之前被召唤).

理解Activity初学者生命周期的一个好方法是用Logs 抛弃你的覆盖方法.例如:

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 -");
    }
}
Run Code Online (Sandbox Code Playgroud)


Jul*_*eau 12

我知道你的问题是6个月前,但万一其他人偶然发现了这个问题:

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

是的,你是.这个:

我点击模拟器的主页按钮(而不是后退按钮),然后启动另一个应用程序,认为这会模仿onPause()活动.

点击主页按钮确实会调用该onPause()方法,但由于主页按钮使您的活动不再可见,因此它将调用该onStop()方法(如提到的爱国者和米尔特).

根据Activities开发人员参考(http://developer.android.com/guide/components/activities.html),您可以显示一个对话框或只是将设备置于睡眠状态.

或者,您调用的活动只会部分阻碍调用活动.因此,调用一个活动来创建一个大小视图的窗口:

 android:layout_width="100dp"
 android:layout_height="100dp"
Run Code Online (Sandbox Code Playgroud)

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

克隆该活动,以便两个视图大小都是"match_parent"而不是"100dp"并调用它,onPause()并且onStop()将调用调用活动的两个和方法,因为调用活动将不可见.

有当然可以例外,如果被叫活动引起像一个应用程序崩溃其任的onCreate(),onStart()onResume()onStop()调用活动将不会被调用,很明显,我只是在谈论一般情况下在这里.


pat*_*iot 4

调用 onPause() 和 onStop() 时的差异可能非常微妙。然而,正如这里所解释的,onPause()通常会在当前活动仍在运行时另一个活动获得焦点(可能是弹出窗口或透明窗口)时执行。如果您完全离开应用程序(例如,通过点击主页按钮),则该 Activity 将不再可见,并且系统可能会执行 onStop()。我只说可能是因为,正如 Alex 提到的,在某些情况下,在 Activity 被销毁之前 onStop 不会被调用。