的onPause()和的onStop()在活动(onPause() and onStop() in

2019-06-26 03:56发布

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

在我的应用程序,我有一个静态类,我的名字计数器,它会持续变量的状态在内存中的应用程序。 我的应用程序运行在模拟器罚款。 我是想试验的不同行为onPause()onStop()

对于onPause ,我想存储在计数器类成员的值保留,而调用onStop()我想要的计数器值重置为零。 所以我重写onStop()和计数器类中的变量设置为零。 然而,在模拟器中,我似乎无法得到暂停状态的应用程序。 在模拟器中,我打开我的应用程序,锻炼吧。 然后我打了仿真器的主页按钮(不后退按钮),并启动其他应用程序,相信这会模仿onPause()活动。 然而,模拟器似乎并没有兑现这个(我使用的是armeabi V7A仿真器),它似乎总是被调用onStop()因为我的计数器值都回去为零,按我的倍率, onStop() 这是固有的仿真器或我做错了什么,让我的活动进入暂停状态?

Answer 1:

我不知道该模拟器您正在使用测试,但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 -");
    }
}


Answer 2:

我知道你的问题在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()调用的活动将不会被调用,很明显,我刚才谈到的一般情况下在这里。



Answer 3:

时的onPause()和的onStop()调用之间的差异可以是相当微妙的。 然而,正如解释在这里 ,在onPause()通常会得到当其他活动发生的焦点(也许作为一个弹出,或透明窗口),而当前的活动仍在运行执行。 如果从应用程序导航完全消失(例如,通过点击home键),活动将不再可见,并且系统可以执行的onStop()。 我只能说可能,因为亚历克斯提到,有一些情况下的onStop在activity被销毁之前不会被调用。



Answer 4:

在onPause():

“如果活动已失去焦点,但仍清晰可见(即新的非全尺寸或透明的活动有专注于你的活动之上),则暂停。一个暂停的activity是完全活着(它保持所有的状态和成员信息和连接到窗口管理器)仍然存在,但可以通过系统在极端低内存情况下被杀死“。

的onStop():

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

从Android的参考活动类措施: http://developer.android.com/reference/android/app/Activity.html



Answer 5:

如果您在模拟的Android 4.x的,你可以控制系统如何处理使用设置背景活动 - >开发人员选项 - >不保留活动和后台进程限制。 对于旧版本有一个名为开发工具的应用程序,它包含了相同的设置。 然而,在内存不足的系统可以忽略这些设置和终止应用程序。 增加分配到模拟器可以帮助的内存量。

此外,如果您是从Eclipse的重新启动您的应用,它会杀死摆好终止它先前的过程来代替。



Answer 6:

我同意雄鱼!

在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”,等等。



文章来源: onPause() and onStop() in Activity