• Activity的生命周期


    activity启动的时候:onCreate ---> onStart ---> onResume 这个过程不用多说,大家都知道。

       1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

       2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

       3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

       4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

       5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

       6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

       7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestroy方法,结束当前Activity。

    七个方法中除了onRestart()方法,其他都是俩俩对应的,从而又可以将活动分为三种生存期

           1.Activity的entire lifetime(全部的生命期)发生在

                                  调用onCreate()和调用onDestory()之间。
            在onCreate()方法中执行全局状态的建立(例如定义布局),在onDestroy()方法中释放所有保存的资源。
           
     
           2.Activity的visible lifetime(可见的生命期)发生在
                                  调用onStart()onStop()之间。
             在这个期间,用户能在屏幕上看见Activity,和它进行交互。
            系统在Activity的完整寿命中可能多次调用onStart()和onStop(),正如Activity交替地对用户可见或隐藏。
     
          3Activity的foreground lifetime (前台的生命期)发生在
                                   调用onResume()onPause()之间。
           在这期间,Activity在屏幕上所有其他Activity的前面,有用户输入焦点。
           一个Activity能频繁的在前台进入和出去之间转变。
    如图
                            
     
       下面是测试代码    我定义了3个按钮    其中第一个是自定义的一个对话框(其中有2种方法来展现对话框的位置),第二,三个来观察Activity的生命周期的
    package com.demo.text;
    
    import com.demo.pullrefresh.R;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Display;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class OneActivity extends Activity implements OnClickListener {
        private Button bb_dialog;
        private Button bb_gotoother;
        private Button bb_gotootherdialog;
    
        /**
         * 它会在活动的第一次被创建时调用,应该在这个方法完成活动的初始化操作,比如加载布局和绑定事件等
         */
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            Log.d("jiejie", "OneActivity————————onCreate");
            init();
        }
    
        private void init() {
            // TODO Auto-generated method stub
            setContentView(R.layout.oneactivity);
            bb_dialog = (Button) findViewById(R.id.bb_dialog);
            bb_gotoother = (Button) findViewById(R.id.bb_gotoother);
            bb_gotootherdialog = (Button) findViewById(R.id.bb_gotootherdialog);
            bb_dialog.setOnClickListener(this);
            bb_gotoother.setOnClickListener(this);
            bb_gotootherdialog.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            switch (arg0.getId()) {
            case R.id.bb_dialog:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                final AlertDialog dialog = builder.create();
                View view = View.inflate(OneActivity.this, R.layout.dialog, null);
                dialog.setView(view, 0, 0, 0, 0);// 设置边距为0,保证在2.x的版本上运行没问题
                Button btnCancel = (Button) view.findViewById(R.id.btn_cancel);
                Button btnOK = (Button) view.findViewById(R.id.btn_ok);
    
                btnOK.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                        Toast.makeText(OneActivity.this, ".....",
                                Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                    }
                });
                btnCancel.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                        dialog.dismiss();
                    }
                });
                dialog.show();
                /*
                 * lp.x与lp.y表示相对于原始位置的偏移.
                 * 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略.
                 * 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略.
                 * 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略.
                 * 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略.
                 * 当参数值包含Gravity.CENTER_HORIZONTAL时
                 * ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动.
                 * 当参数值包含Gravity.CENTER_VERTICAL时
                 * ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动.
                 * gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL |
                 * Gravity.CENTER_VERTICAL.
                 * 
                 * 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在
                 * 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了, Gravity.LEFT,
                 * Gravity.TOP, Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离
                 */
                // Window dialogWindow = dialog.getWindow();
                // WindowManager.LayoutParams lp = dialogWindow.getAttributes();
                // dialogWindow.setGravity(Gravity.LEFT|Gravity.TOP);
                // lp.x = 100;
                // lp.y = 100;
                // lp.width = 300;
                // lp.height = 300;
                // lp.alpha = 0.7f;
                // dialogWindow.setAttributes(lp);
    
                WindowManager m = getWindowManager();
                Display d = m.getDefaultDisplay();
                android.view.WindowManager.LayoutParams p = dialog.getWindow()
                        .getAttributes();
                p.height = (int) (d.getHeight() * 0.4);
                p.width = (int) (d.getWidth() * 0.75);
                p.x = 10;
                p.y = 150;
                dialog.getWindow().setAttributes(p);
                break;
            case R.id.bb_gotoother:
                startActivity(new Intent(OneActivity.this, OtherClass.class));
                break;
            case R.id.bb_gotootherdialog:
                startActivity(new Intent(OneActivity.this, OtherDialog.class));
                break;
            default:
                break;
            }
        }
    
        /**
         * 这个方法在活动由不可见变成可见的时候调用
         */
        @Override
        protected void onStart() {
            // TODO Auto-generated method stub
            super.onStart();
            Log.d("jiejie", "OneActivity————————onStart");
        }
    
        /**
         * 这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行的状态
         */
        @Override
        protected void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
            Log.d("jiejie", "OneActivity————————onResume");
        }
    
        /**
         * 这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中
         * 将一些消耗CPU的资源释放掉,以及保存一些关键的数据,但这个方法的执行速度一定要快, 不然会影响到新的栈顶活动的使用。
         */
        @Override
        protected void onPause() {
            // TODO Auto-generated method stub
            super.onPause();
            Log.d("jiejie", "OneActivity————————onPause");
        }
    
        /**
         * 这个方法在活动完全不可见的时候调用。它和onPause()方法的主要区别在于,
         * 如果启动的新活动是一个对话框的活动,那么onPause()方法会得到执行,而onStop() 方法并不会执行
         */
        @Override
        protected void onStop() {
            // TODO Auto-generated method stub
            super.onStop();
            Log.d("jiejie", "OneActivity————————onStop");
        }
    
        /**
         * 这个方法在活动被销毁之前调用,之后活动的状态将变成销毁状态
         */
        @Override
        protected void onDestroy() {
            // TODO Auto-generated method stub
            super.onDestroy();
            Log.d("jiejie", "OneActivity————————onDestroy");
        }
    
        /**
         * 这个方法在活动由停止变为运行状态之前调用,也是活动被重新启动了。
         */
        @Override
        protected void onRestart() {
            // TODO Auto-generated method stub
            super.onRestart();
            Log.d("jiejie", "OneActivity————————onRestart");
        }
    }

    其中子定义对话框的xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:background="#fff"
        android:orientation="vertical"
        android:paddingBottom="5dp" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:padding="15dp"
            android:text="你确定要删除?"
            android:textSize="20sp" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="4dp"
            android:paddingRight="4dp" >
    
            <Button
                android:id="@+id/btn_cancel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="-8dp"
                android:layout_marginRight="1dp"
                android:layout_marginTop="-8dp"
                android:layout_weight="1"
                android:background="@drawable/selector_btn1"
                android:text="取 消"
                android:textColor="@android:color/white" />
    
            <Button
                android:id="@+id/btn_ok"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="-8dp"
                android:layout_marginLeft="1dp"
                android:layout_marginTop="-8dp"
                android:layout_weight="1"
                android:background="@drawable/selector_btn"
                android:text="确 定"
                android:textColor="@android:color/white" />
        </LinearLayout>
    
    </LinearLayout>
    View Code

    android:background="@drawable/selector_btn"

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:drawable="@drawable/btn_pressed" android:state_pressed="true"></item>
        <item android:drawable="@drawable/btn_normal"></item>
    </selector>
    View Code

    现在来观察Activity的生命周期

    当点击运行时

    1.随后点击进入另一个Activity     先调用了onPause()系统准备调用另一个活动,过几秒调用了onStop的方法

    在另一个Activity 重新返回第一个Activity时(finish下)

    所以我们看下当我在一个Activity(one)来启动另一个Activity(other)随后finish otherActivity  来显示第一个Activity   然后在finish 第一个Activity的生命周期

    2. 点击跳转按钮,由OneActivity跳转到Otherdialog:

    由于SecondActivity是Dialog,所以MainActivity依然可见,所以只调用了它的onPause()方法。

    当OneActivity重新获取焦点

    所以它的生命周期为

  • 相关阅读:
    字符串哈希之Rabin-Karp,poj1200
    字符串哈希之ELFHash,poj2503
    dfs之n的全排列
    几大排序算法(选择,插入)
    dfs之地图染色
    单纯的dfs
    dfs之记忆化搜索(字符串匹配,位置相对变)
    STL之map的一种用法
    JAVA之大数处理,有简单方法不用是sb
    ACM之素数环(DFS)
  • 原文地址:https://www.cnblogs.com/wangfengdange/p/5109794.html
Copyright © 2020-2023  润新知