繁体   English   中英

Activity中的onPause()和onStop()

[英]onPause() and onStop() in Activity

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

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

对于onPause ,我希望保留Counter类成员中存储的值,而调用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()活动。

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

根据Activities开发人员参考( 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()通常会在另一个活动获得焦点(可能是弹出窗口或透明窗口)时执行。 如果您完全离开应用程序(例如,通过点击主页按钮),活动将不再可见,系统可能会执行onStop()。 我只是说因为,正如亚力克提到的那样,在某些情况下,在销毁活动之前不会调用onStop。

在onPause():

“如果一项活动失去焦点但仍然可见(即,一项新的非全尺寸或透明活动专注于您的活动之上),它会暂停。暂停的活动完全存在(它保持所有状态和成员信息并保持附加到窗口管理器),但可以在极低内存情况下被系统杀死。“

的onStop():

“如果某个活动被另一个活动完全遮挡,它就会被停止。它仍会保留所有状态和成员信息,但是,它不再对用户可见,因此它的窗口被隐藏,当内存经常会被系统杀死在其他地方需要。“

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

如果您正在模拟Android 4.x,您可以使用设置 - >开发者选项 - >不保持活动和后台进程限制来控制系统处理后台活动的方式。 对于旧版本,有一个名为Dev Tools的应用程序包含相同的设置。 但是,在内存不足的情况下,系统可以忽略这些设置并终止您的应用程序。 增加分配给模拟器的内存量可能会有所帮助。

此外,如果您从Eclipse重新启动应用程序,它将终止先前的进程,而不是正常终止它。

我赞同米勒!

在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”等......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM