Android生命周期回顾

生命周期与程序的健壮性有着密不可分的关系

  • Activity的生命周期
  • Fragment的生命周期
  • Service的生命周期

1.Activity的生命周期

官方图.png

这张经典图大家一定不陌生,图中包含了两层含义

  • 三个状态,分别是活动生存期,可见生存期,以及完整生存期
    onStart→onResume→onPause→onSaveInstanceState→onStop 这段生命期称之可见生存期
    onResume→onPause这段生命期称之活动状态生存期
    onCreate→onDestroy这段生命期称之完整生存期

  • 各个生存期在什么情况下被调用

我们配合代码来验证一下官方图,毕竟动手实践过后才能更好的领悟,测试机型:Sumsung S6 edge+

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "LifeCycle";

    private Button mybtnButton;
  

    /**
     * 在完整生存期开始时调用
     *
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "Activity-----onCreate is call.......");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mybtnButton = (Button) findViewById(R.id.btn);
        mybtnButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    /**
     * 在onCreate方法后调用,用于恢复UI状态
     * 从savedInstanceState恢复UI状态
     * 这个savedInstanceState也被传递给了onCreate
     * 自Activity上次可见之后,只有当系统终止了该Activity时,才会被调用
     * 在随后的Activity进程的可见生存期之前被调用
     *
     * @see android.app.Activity#onRestoreInstanceState(android.os.Bundle)
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.i(TAG, "Activity-----onRestoreInstanceState is call start.......");
        super.onRestoreInstanceState(savedInstanceState);
    }

    /**
     * 在可见生存期开始时调用
     *
     * @see android.app.Activity#onStart()
     */
    @Override
    protected void onStart() {
        Log.i(TAG, "Activity-----onStart is call start.......");
        super.onStart();
    }

    /**
     * 在Activity活动状态生存期开始时调用
     *
     * @see android.app.Activity#onResume()
     */
    @Override
    protected void onResume() {
        Log.i(TAG, "Activity-----onResume is call start.......");
        super.onResume();
    }

    /*
     * 把UI状态保存到outState中
     * 如果进程被运行时终止并重启,那么这个Bundle会被传递给onCreate和onRestoreInstanceState
     * @see android.app.Activity#onSaveInstanceState(android.os.Bundle)
     */
    @Override
    protected void onSaveInstanceState(Bundle savedInstanceState) {
        Log.i(TAG, "Activity-----onSaveInstanceState is call start.......");
        super.onSaveInstanceState(savedInstanceState);
    }

    /**
     * 在Activity活动状态生存期结束时被调用
     * 挂起UI更新,线程或者CPU密集的进程
     */
    @Override
    protected void onPause() {
        Log.i(TAG, "Activity-----onPause is call start.......");
        super.onPause();
    }
   /**
     * 挂起UI更新,线程或者处理
     * 当Activity不可见时,保存所有的编辑或者状态改变
     * 调用这个方法后,进程可能会被终止
     */
    @Override
    protected void onStop() {
        Log.i(TAG, "Activity-----onStop is call start.......");
        super.onStop();

    }
    /**
      * 清理所有的资源,包括结束线程,关闭数据库连接等
      */
    @Override
    protected void onDestroy() {
        Log.i(TAG, "Activity-----onDestroy is call start.......");
        super.onDestroy();

    }
    /**
      * 当Activity由不可见到可见时调用
      */
    @Override
    protected void onRestart() {
        Log.i(TAG, "Activity-----onRestart is call start.......");
        super.onRestart();
    }
}

首次打开Activity,程序运行日志:

com.example.administrator.lifecycle I/LifeCycle: Activity-----onCreate is call.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStart is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onResume is call start.......

Activity切换到后台不可见时,例如按下Home键,锁屏,跳转至另外一个activity,程序运行日志:

com.example.administrator.lifecycle I/LifeCycle: Activity-----onPause is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onSaveInstanceState is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStop is call start.......

Activity后台切换到前台,程序运行日志:

com.example.administrator.lifecycle I/LifeCycle: Activity-----onRestart is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStart is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onResume is call start.......

Activity处于可见状态但失去焦点时,例如栈顶的Activity是透明的或者栈顶Activity并不是铺满整个手机屏幕,需要注意的是Dialog并不会影响Activity的生命周期,程序运行日志:

com.example.administrator.lifecycle I/LifeCycle: Activity-----onPause is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onSaveInstanceState is call start.......

Activity由可见状态但失去焦点切换到可见并且有焦点,程序运行日志:

com.example.administrator.lifecycle I/LifeCycle: Activity-----onResume is call start.......

Activity退出销毁时,程序运行日志:

com.example.administrator.lifecycle I/LifeCycle: Activity-----onPause is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStop is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onDestroy is call start.......

Activity横竖屏切换时,程序运行日志:

com.example.administrator.lifecycle I/LifeCycle: Activity-----onPause is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onSaveInstanceState is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStop is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onDestroy is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onCreate is call.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStart is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onRestoreInstanceState is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onResume is call start.......

如何避免横竖屏切换重走生命周期?在AndroidManifest文件中的对应Activity中配置
android:configChanges="keyboardHidden|orientation|screenSize"

值得注意的是应用切换到后台,系统有可能会销毁这个后台进程,再次点击桌面APP,程序运行日志 :

com.example.administrator.lifecycle I/LifeCycle: Activity-----onDestroy is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onCreate is call.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStart is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onResume is call start.......

另外我们可以在onSaveInstanceState 中保存UI的状态,在onRestoreInstanceState中恢复UI的状态

2.Fragment的生命周期

fragment生命周期官方图.png

Fragment不能单独存在需要依存Activity,Activity的生命周期会直接影响Fragment的生命周期。他们的生命周期大致是一致的,只是Fragment多了几个生命周期回调方法


activity和fragment生命周期对比图.png

实践验证

public class StateFragment extends Fragment {

  private static final String TAG = "LifeCycle";

  /**
   * 调用该方法时,Fragment会被连接到它的父Activity上
   */
  @Override
  public void onAttach(Context context) {
      Log.i(TAG, "Fragment-----onAttach is call start.......");
      super.onAttach(context);
  }

  /**
   * 调用该方法来进行Fragment的初始创建
   */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      Log.i(TAG, "Fragment-----onCreate is call start.......");
      super.onCreate(savedInstanceState);
  }

  /**
   * 一旦Fragment已被创建,要创建它自己的用户界面时调用该方法
   * 创建,或者填充Fragment的UI,并返回它
   * 如果这个Fragment没有UI,那么返回null
   */
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      Log.i(TAG, "Fragment-----onCreateView is call start.......");
      View view = inflater.inflate(R.layout.my_state_fragment, container, false);
      return view;
  }

  /**
   * 一旦父Activity和Fragment的UI已经被创建,则调用该方法
   */
  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
      Log.i(TAG, "Fragment-----onActivityCreated is call start.......");
      super.onActivityCreated(savedInstanceState);
  }

  @Override
  public void onViewStateRestored(Bundle savedInstanceState) {
      Log.i(TAG, "Fragment-----onViewStateRestored is call start.......");
      super.onViewStateRestored(savedInstanceState);
  }

  /**
   * 在可见生命周期的开始时被调用
   */
  @Override
  public void onStart() {
      Log.i(TAG, "Fragment-----onStart is call start.......");
      super.onStart();
  }

  /**
   * 在活动生命周期开始时被调用
   */
  @Override
  public void onResume() {
      Log.i(TAG, "Fragment-----onResume is call start.......");
      super.onResume();
  }

  /**
   * 在活动生命周期结束时被调用
   */
  @Override
  public void onPause() {
      Log.i(TAG, "Fragment-----onPause is call start.......");
      super.onPause();
  }

  /**
   * 在活动生命周期结束时被调用,保存UI的状态变化
   * 将UI的变化信息保存到savedInstanceState中
   * 这个savedInstanceState会被传递到onCreate,onCreateView和onActivityCreated,onViewStateRestored(如果它的父Activity被终止并且重新启动)方法中
   */
  @Override
  public void onSaveInstanceState(Bundle savedInstanceState) {
      Log.i(TAG, "Fragment-----onSaveInstanceState is call start.......");
      super.onSaveInstanceState(savedInstanceState);
  }

  /**
   * 在可见生命周期结束时调用该方法
   */
  @Override
  public void onStop() {
      Log.i(TAG, "Fragment-----onStop is call start.......");
      super.onStop();
  }

  /**
   * 当Fragment的view被分离时,调用该方法
   * 清除资源相关的view
   */
  @Override
  public void onDestroyView() {
      Log.i(TAG, "Fragment-----onDestroyView is call start.......");
      super.onDestroyView();
  }

  /**
   * 在整个生命周期结束的时候调用
   * 清除所有的资源,包括线程和关闭数据库连接等
   */
  @Override
  public void onDestroy() {
      Log.i(TAG, "Fragment-----onDestroy is call start.......");
      super.onDestroy();
  }

  /**
   * 当Fragment从它的父Activity上分离时调用
   */
  @Override
  public void onDetach() {
      Log.i(TAG, "Fragment-----onDetach is call start.......");
      super.onDetach();
  }
}

输出日志我就不贴了和Activity大致差不多,对照官方图以及对比图应该很好理解。

3.Service的生命周期

Service的生命周期.png

这张图说明了两种不同开启Service方式的生命周期,下面对这两种方式的区别和联系做一下说明

  • startService 如果Service已经开启过那么会直接调用onStartCommand(),这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它,当Service被停止时,系统会销毁它。

  • bindService 不允许多次绑定同一个组件(客户),但是可以绑定多个组件(客户),可以显示的调用unbindService来关闭这种连接,当多个客户都解除绑定之后也就是没有客户与Service有绑定关系了,系统会销毁Service。

一个被开启的service仍然可能被绑定,也就是startService后仍然可以bindService ,但是此时调用stopSelf()方法或者其他组件调用stopService()方法并不会停止Service,除非Service没有绑定关系了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容