The Activity Lifecycle

系统提供了 6 个回调方法来处理 Activity 生命周期中不同的状态:
onCreate(), onStart(), onResume(), onPause(), onStop(), and onDestroy()

image

系统杀死一个 APP 进程时,有可能进程依然存在于内存中,这取决于当时 Activity 的状态。

onCreate(Bundle savedInstanceState)

这个方法只在 Acitvity 启动时调用一次,通常用来设置布局视图setContentView(),和初始化变量。
savedInstanceState 参数记录了上次 Activity 的状态(onSaveInstanceState(Bundle outState)方法里保存的状态)

恢复状态可以在 onCreate 和 onRestoreInstanceState 里完成。

TextView mTextView;

// some transient state for the activity instance
String mGameState;

@Override
public void onCreate(Bundle savedInstanceState) {
    // call the super class onCreate to complete the creation of activity like
    // the view hierarchy
    super.onCreate(savedInstanceState);

    // recovering the instance state
    if (savedInstanceState != null) {
        mGameState = savedInstanceState.getString(GAME_STATE_KEY);
    }

    // set the user interface layout for this activity
    // the layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);

    // initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_view);
}

// This callback is called only when there is a saved instance that is previously saved by using
// onSaveInstanceState(). We restore some state in onCreate(), while we can optionally restore
// other state here, possibly usable after onStart() has completed.
// The savedInstanceState Bundle is same as the one used in onCreate().
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    mTextView.setText(savedInstanceState.getString(TEXT_VIEW_KEY));
}

// invoked when the activity may be temporarily destroyed, save the instance state here
@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putString(GAME_STATE_KEY, mGameState);
    outState.putString(TEXT_VIEW_KEY, mTextView.getText());

    // call superclass to save any view hierarchy
    super.onSaveInstanceState(outState);
}

onStart

这个方法代表 Acitivity 已经准备好进入前台了,可以和用户交互了。通常这里可以放置初始化用户 UI 的代码。

onResume

这个状态下 APP 处于与用户的交互中,并一直保持到失去焦点,例如来电、息屏、用户转到另一个 APP 等。APP 可能会在 Resume 和 Pause 状态之间来回跳转。

onPause

Activity 失去焦点后进入暂停状态,恢复后从新进入 resume 状态。这个方法执行时间应该很短,不应该在这里执行一些耗时的工作,例如保存用户数据、执行网络操作、处理数据库事务等,这些工作可以在 onStop里完成。该方法完成后,它有可能调用 onResumeonStop,取决于 Activity 是被重新恢复或者变得完全不可见。

onStop

这个方法在 Activity 变得不可见,或者 APP 即将终止时调用。在这里可以释放一些 APP 不再需要的资源、保存数据等操作。在这个状态, Acitvity 任然在内存里,因此不需要做数据保存和恢复。系统可能因为需要内存而随时销毁 Activity。这个方法结束后有两个选择:onRestart()onDestroy()

onDestroy

onDestroy 的调用分两种情况:
由于用户完全关闭 Activity,或者 onFinish 被调用。
由于设备配置改变(如旋转方向)临时销毁 Acitvity,然后重建。
通过 isFinishing方法可以区分这两种情况。第一种情况 onCleared()会被调用。第二种情况onCreate()被调用。

Activity 状态与内存释放的关系

Likelihood of being killed Process state Activity state
Least Foreground (having or about to get focus) Created, Started,Resumed
More Background (lost focus) Paused
Most Background (not visible) Stopped, Empty, Destroyed

系统不会单独释放 Acitvity,而是释放整个 进程。

保护和恢复 UI 状态

ViewModel, onSaveInstanceState()
当系统因内存压力或配置改变而关闭 Acitivity 时会自动保存状态,恢复时自动重建。状态保存在 Bundle 对象里,但它只能保存简单的数据,会占用系统内存,如果要保存大量数据,需要用onSaveInstanceState(), ViewModel class将数据保存到本地存储。
恢复对象可以在onCreate() 和 onRestoreInstanceState()里,前置需要判断 Bundle 是否为空,后者不需要,只有系统有 state 要恢复时它才在onStart之后调用。

从一个 Acitivity 启动另一个 Activity

通过传递一个 Intent 对象给startActivity() 或 startActivityForResult()创建。
使用startActivityForResult()创建带返回值的 Acitvity,用 onActivityResult(int, int, Intent)方法接收结果,在子 Acitvity 中用 setResult(int)设置返回结果。

public class MyActivity extends Activity {
     // ...

     static final int PICK_CONTACT_REQUEST = 0;

     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
             // When the user center presses, let them pick a contact.
             startActivityForResult(
                 new Intent(Intent.ACTION_PICK,
                 new Uri("content://contacts")),
                 PICK_CONTACT_REQUEST);
            return true;
         }
         return false;
     }

     protected void onActivityResult(int requestCode, int resultCode,
             Intent data) {
         if (requestCode == PICK_CONTACT_REQUEST) {
             if (resultCode == RESULT_OK) {
                 // A contact was picked.  Here we will just display it
                 // to the user.
                 startActivity(new Intent(Intent.ACTION_VIEW, data));
             }
         }
     }
 }

一个 Acitvity 打开另一个 Activity 时回调方法执行顺序

  1. Activity A's onPause() method executes.
  2. Activity B's onCreate(), onStart(), and onResume() methods execute in sequence. (Activity B now has user focus.)
  3. Then, if Activity A is no longer visible on screen, its onStop() method executes.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 启动与销毁Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对...
    安卓Boy阅读 1,745评论 3 5
  • Activity https://developer.android.com/guide/components/a...
    XLsn0w阅读 696评论 0 4
  • 1.Activity 说下Activity的生命周期? 答: onStart()和onResume()/onPau...
    KD小帅阅读 1,542评论 0 1
  • 易效能的时间管理从27-28高能量的课程开始 我们三百多人走到了一起,一起去实现90天的目标。二天的道术器用。从叶...
    小宝歌阅读 165评论 0 0
  • 临近年根 我家开始有亲戚来串门 跟我爸一起之前干活的五叔来我家 好像是还钱来了(有欠钱不能过年的讲究)数完钱 ...
    Betty李李阅读 188评论 0 1