zoukankan      html  css  js  c++  java
  • 老生常谈的问题——Activity的生命周期

    Activity的生命周期

    每个学习安卓的同桌应该都知道Activity是拥有自己的生命周期的。算起来这也是一个老生常谈的问题了。很多时候我们根本就没有体会这到底有什么作用,但实际上,了解Activity的生命可以让我们更好的理解页面切换、任务这些行为下发生的过程,开发出更加健壮的应用。

    这张图片是官方文档给出的,概括起来就一句话:当你要用一个Activity时,它的状态会一直上升直到Resumed,而当Activity不再使用时,它的状态就会不断的下降直到Destroy。

    这样讲还是很抽象,来看一个demo。

    这个demo包括一个MainActivity、一个AnotherActivity和一个DialogActivity(就是使用了对话框主题的Activity)。

    主界面是这样的。

    布局就不贴出来了~~~来看看具体的代码:

    View Code
     1 public class MainActivity extends Activity {
     2     
     3     private static final String LOG_TAG = "DEBUG";
     4 
     5     private Button btn_showDialog, btn_startDialogActivity, btn_startAnotherActivity;
     6 
     7     @Override
     8     protected void onCreate(Bundle savedInstanceState) {
     9         super.onCreate(savedInstanceState);
    10         Log.d(LOG_TAG, "create");
    11         setContentView(R.layout.activity_main);
    12         findView();
    13         setListener();
    14     }
    15 
    16     private void findView() {
    17         btn_showDialog = (Button) findViewById(R.id.btn_showDialog);
    18         btn_startDialogActivity = (Button) findViewById(R.id.btn_startDialogActivity);
    19         btn_startAnotherActivity = (Button) findViewById(R.id.btn_startAnotherActivity);
    20     }
    21 
    22     private void setListener() {
    23         btn_showDialog.setOnClickListener(new OnClickListener() {
    24 
    25             @Override
    26             public void onClick(View v) {
    27                 Log.d(LOG_TAG, "启动对话框");
    28                 new AlertDialog.Builder(MainActivity.this).setTitle("This is a dialog").show();
    29             }
    30         });
    31 
    32         btn_startDialogActivity.setOnClickListener(new OnClickListener() {
    33 
    34             @Override
    35             public void onClick(View v) {
    36                 Log.d(LOG_TAG, "启动对话框形式的Activity");
    37                 startActivity(new Intent(MainActivity.this, DialogActivity.class));
    38             }
    39         });
    40 
    41         btn_startAnotherActivity.setOnClickListener(new OnClickListener() {
    42 
    43             @Override
    44             public void onClick(View v) {
    45                 Log.d(LOG_TAG, "启动普通的Activity");
    46                 startActivity(new Intent(MainActivity.this, AnotherActivity.class));
    47             }
    48         });
    49     }
    50 
    51     @Override
    52     protected void onStart() {
    53         super.onStart();
    54         Log.d(LOG_TAG, "start");
    55     }
    56 
    57     @Override
    58     protected void onResume() {
    59         super.onResume();
    60         Log.d(LOG_TAG, "resume");
    61     }
    62 
    63     @Override
    64     protected void onPause() {
    65         super.onPause();
    66         Log.d(LOG_TAG, "pause");
    67     }
    68 
    69     @Override
    70     protected void onStop() {
    71         super.onStop();
    72         Log.d(LOG_TAG, "stop");
    73     }
    74 
    75     @Override
    76     protected void onDestroy() {
    77         super.onDestroy();
    78         Log.d(LOG_TAG, "destroy");
    79     }
    80 
    81 }

    这个也没什么好说的,就是对三个按钮设置监听器分别启动相应的界面,再有就是把状态打印出来。

    好的,启动我们的程序来看看Logcat输出了什么:

    嗯,这结果符合我们的预期。启动一个Activity应该是先onCreate再onStart再onResumed。

    我们再点击一下“显示一个对话框”看看怎样:

    可以看到,弹出了一个对话框,我们再来看看Logcat:

    只有一个“启动对话框”就没有了,也就是说弹出一个对话框不会涉及来生命周期的切换的。

    笔者当时就疑问了,因为官方的图中是这样写的:

    看来不是所有的“partially visible”都会引起onPause这个方法的。

    好的,我们按一下返回,再按“启动对话框形式的Activity”看看发生了什么:

    嗯,这次就符合了。不出所料的话,按下返回就会调用onResumed方法了:

    接下来,我们就启动一个新的Activity,再按返回

    应该可以猜到了,这次不是“部分可见”了,所以应该会比上一次多一个onStop和onStartr的:

    哈哈,果然没错!

    最后当然就是按返回退出了:

    好了,我们把基本的过程都模拟了一遍,现在来总结一下:

    1. Antivity的生命周期是从onCreate方法开始的,我们的组件也应该是在这里进行初始化。
    2. 当Activty部分可见的时候会进入pause状态,但并不是所有情况都是!
    3. 当Activity完全不可见时,会进入stop状态。(这个我不知有没有特例~~~)
    4. 当Activity被销毁的时候,onDestory会被调用。
    5. 总之,多动手多实践~~~
  • 相关阅读:
    利用HashSet去重
    互联网春天来了吗?
    了解一下ECMA标准提案的几个阶段(stagex)
    peerDependencies WARNING 警告剖析
    React Error 无法分配为只读函数"类"的属性名称
    JavaScript 经典代码大全
    Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)
    父页面与子页面传数据(脚本传数据)
    ASP.NET程序中常用的三十三种代码
    将GridView导出到Excel并防止内容乱码
  • 原文地址:https://www.cnblogs.com/yjiyjige/p/2776247.html
Copyright © 2011-2022 走看看