Android生命周期回顾

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

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

1.Activity的生命周期

Android生命周期回顾_第1张图片
官方图.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的生命周期

Android生命周期回顾_第2张图片
fragment生命周期官方图.png

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


Android生命周期回顾_第3张图片
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的生命周期

Android生命周期回顾_第4张图片
Service的生命周期.png

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

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

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

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

你可能感兴趣的:(Android生命周期回顾)