zoukankan      html  css  js  c++  java
  • Android-管理Activity生命周期 -停止和重启Activity

    停止和重启activity在activity的生命周期中很重要,它能让用户感觉你的app总是激活的而且不会丢失他们的进度。activity在下面的这些情况会停止和重启:

    • 用户打开常用app窗口然后从你的app切换到其他app。你的app中的activity现在就在后台了而且停止了。如果用户从主屏的启动图标或者最近使用的app窗口返回到你的app,这个activity就会重启。

    • 用户在你的程序中执行了一个操作来启动一个新的activity。当前的activity在第二个activity创建时就会停止了。如果用户点击了返回按钮,第一个activity就重启了。

    • 用户在使用你的app时接到电话。

    注意:因为当activity停止时系统在系统内存中保留了实例,可能不需要实现onStop()和onRestart()甚至onStart()方法。对于大多数activity来说相对简单,activity会很好的停止和重启,你只需要使用onPause()来暂停正在执行的操作和断开与系统资源的连接。

    图1.当用户离开activity,系统会调用onStop()来停止activity。如果activity停止后用户返回,系统会调用onRestart(),然后紧接着onStart()和onResume()。注意不管是什么情况导致activity要停止,系统总是会在调用onStop()前调用onPause()。

    停止Activity

    当activity被调用onStop()方法后,它不在可见并且需要释放用户不使用的绝大多数资源。一旦activity停止了,系统可能会在清理内存时销毁实例。在极端的情况下,系统可能不调用onDestroy()直接杀掉app进程,所有用onStop()来释放资源防止内存泄漏很重要。

    虽然在onStop()之前调用了onPause()方法,你应该使用onStop()来处理大部分消耗CPU的操作,比如写入信息到数据库。

    这里有一个实现onStop()的例子,它把笔记草稿保存的永久的存储中:

    @Override
    protected void onStop() {
        super.onStop();  // Always call the superclass method first
                                         
        // 保存笔记草稿,因为activity将要停止
        // 我们要保证当前的笔记进度不丢失
        ContentValues values = new ContentValues();
        values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
        values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
                                         
        getContentResolver().update(
                mUri,    // The URI for the note to update.
                values,  // The map of column names and new values to apply to them.
                null,    // No SELECT criteria are used.
                null     // No WHERE columns are used.
                );
    }

    当activity停止后,activity对象保存在内存中,当activity恢复时会被再调用。不需要在任何的回调方法中重新初始化组件来回到Resumed状态。系统也记录了layout中每个View的状态,所以如果用户在EditText控件中输入了文字,这些内容会被保留,所以你不需要保存和还原它。

    注意:虽然系统在activity停止时销毁了它,但是仍然在Bundle(一系列的键值对)中保存这View对象(比如EditText中的文字)的状态然后在用户切换回原来的activity时恢复他们。(后面会讲更多的关于使用Bundle在activity销毁和再创建时保存状态数据) 

    开始/重启Activity

    当activity从停止状态返回到前台,它收到onRestrart()调用。系统也会调用onStart()方法,每次activity变成可见时都会调用(不管时被重启还是第一次创建)。这个onRestart()方法,只有在activity从停止状态恢复时才会调用,所以你可以用它做一些特殊的恢复操作只要activity之前被停止了并且没有销毁。 

    app使用onRestart()来恢复activity的状态不常见, 所以没有使用这个方作作为app入口的讲解。但是,因为onStop()方法本质上清理掉了activity的资源,你需要在activity重启的时候需要重新实例化他们。第一次创建的时候也需要实例化他们(当没有存在的实例时)。由于这个原因,你应该使用onStart()方法对应onStop()方法,因为系统在创建activity和从停止状态重启时都会调用onStart()。

    例如,由于用户在回来app之前已经没有进入app很长时间了,onStart()方法是一个查看系统功能是否可用的好地方:

    @Override
    protected void onStart() {
        super.onStart();  // Always call the superclass method first
                    
        // activity可能是重启也可能是第一次启动
        // 所以在这里我们应该确保GPS功能可用
        LocationManager locationManager = 
                (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                    
        if (!gpsEnabled) {
            // Create a dialog here that requests the user to enable GPS, and use an intent
            // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
            // to take the user to the Settings screen to enable GPS when they click "OK"
        }
    }
                
    @Override
    protected void onRestart() {
        super.onRestart();  // Always call the superclass method first
                    
        // Activity being restarted from stopped state    
    }

    当系统销毁activity时,调用activity的onDestroy()方法。由于已经在onStop()中释放了大部分资源,在收到onDestroy()调用时,大多数app不需要做什么了。这个方法时清理资源防止内存泄漏的最后机会,所以需要确保被添加的线程被销毁了还有长时间运行的操作(比如追踪方法)也被停止了。

    上一篇:Android-管理Activity生命周期 -暂停和恢复一个Activity

    下一篇:Android-管理Activity生命周期 -重新创建Activity

  • 相关阅读:
    CGCDSSQ
    100200H
    斗地主
    借教室
    bzoj 3743
    17B
    能量项链
    589
    16-求连续数组和最大
    15-幸运数组4、7
  • 原文地址:https://www.cnblogs.com/fengquanwang/p/3142370.html
Copyright © 2011-2022 走看看