Android之Activity生命周期浅谈

作为Android的四大组件之一的Activity的生命周期是每个Android 程序员必须掌握的知识!
本Demo下共分为三个Activity,分别为MainActivity,NormalActivity,DialogActivity以及它们分别对应的xml布局文件为activity_main.xml,normal_layout.xml,dialog_layout.xml!
Activity代码:
MainActivity.java


public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "MainActivity onCreate() ");
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        Button startNormalActivity = (Button)findViewById(R.id.start_normal_activity);
        Button startDialogActivity = (Button)findViewById(R.id.start_dialog_activity);
        startNormalActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,NormalActity.class);
                startActivity(intent);
            }
        });

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

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "MainActivity onStart() ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"MainActivity onResume() ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "MainActivity onPause() ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "MainActivity onStop() ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "MainActivity onDestroy() ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "MainActivity onRestart() ");
    }
}

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "MainActivity onSaveInstanceState() ");
    }

在MainActivity中分别重写了父类的onCreate() onStart() onResume() onPause() onStop() onDestory() onRestart()七个生命周期方法以及onSaveInstanceState()方法并在相应的方法中打印log日志。
NormalActivity.java&DialogActivity.java中同样的覆盖以上七个方法并打印Log日子 代码如下
NormalActivity.java

public class NormalActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.normal_layout);
        Log.d(TAG, "NormalActivity onCreate() ");
    }


    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "NormalActivity onStart() ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"NormalActivity onResume() ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "NormalActivity onPause() ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "NormalActivity onStop() ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "NormalActivity onDestroy() ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "NormalActivity onRestart() ");
    }

}

DialogActivity.java

public class DialogActivity extends Activity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.dialog_layout);
        Log.d(TAG, "DialogActivity onCreate() ");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "DialogActivity onStart() ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"DialogActivity onResume() ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "DialogActivity onPause() ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "DialogActivity onStop() ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "DialogActivity onDestroy() ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "DialogActivity onRestart() ");
    }

}

以下是XML布局文件关键代码:

activity_main.xml

 <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/start_normal_activity"
        android:text="Start NormalActivity" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/start_dialog_activity"
        android:text="Start DialogActivity" />

normal.xml

 <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a normal activity!"/>

dialog_layout.xml

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a dialog Activity!"/>

接下来就是在AndroidManifest.xml文件中对三个Activity进行相应的注册
关键代码如下:注意其中指定DialogActivity的Theme为Theme.Dialog
这样是让DialogActivity使用一个对话框方式的主题

         <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".NormalActivity" />
        <activity
            android:name=".DialogActivity"
            android:theme="@android:style/Theme.Dialog">
        </activity>

接下来运行程序 可以看到此时Log日子信息如下:
在activity开始创建时会顺序的调用onCreate(),onStart(),onResume()三个方法
此时activity进入运行状态

04-11 16:31:23.840 11678-11678/? D/MainActivity: MainActivity onCreate() 
04-11 16:31:23.880 11678-11678/? D/MainActivity: MainActivity onStart() 
04-11 16:31:23.880 11678-11678/? D/MainActivity: MainActivity onResume() 

点击start NormalActivity按钮启动NormalActivity 此时在观察日志信息发现多出如下日子:
系统会首先调用MainActivity的onOnpause方法 然后在调用跳转acctivity创建时的三个方法,
最后再调用MainActivity的onSaveInstanceState以及onStop,此时MainActivity进入停止状态,
NormalActivity进入运行状态。


04-11 16:41:07.660 11678-11678/? D/MainActivity: MainActivity onPause() 
04-11 16:41:07.850 11678-11678/? D/MainActivity: NormalActivity onCreate() 
04-11 16:41:07.850 11678-11678/? D/MainActivity: NormalActivity onStart() 
04-11 16:41:07.850 11678-11678/? D/MainActivity: NormalActivity onResume() 
04-11 16:41:08.210 11678-11678/? D/MainActivity: MainActivity onSaveInstanceState() 
04-11 16:41:08.210 11678-11678/? D/MainActivity: MainActivity onStop() 

然后再点击back按键返回MainActivity发现多出如下日志信息:
首先调用Mainactivity的onPause,onRestart,onStart,onResume进入运行状态。
然后调用NormalActivity的onStop记忆onDestory方法。


04-11 16:44:17.290 11678-11678/? D/MainActivity: NormalActivity onPause() 
04-11 16:44:17.300 11678-11678/? D/MainActivity: MainActivity onRestart() 
04-11 16:44:17.300 11678-11678/? D/MainActivity: MainActivity onStart() 
04-11 16:44:17.300 11678-11678/? D/MainActivity: MainActivity onResume() 
04-11 16:44:17.680 11678-11678/? D/MainActivity: NormalActivity onStop() 
04-11 16:44:17.680 11678-11678/? D/MainActivity: NormalActivity onDestroy() 

然后点击start dialogActivity按钮发现多出如下日志信息:
与启动NormalActivity唯一不同的时没有调用MainActivity onStop(),这是因为此时MainActivity还没有完全不可见。

04-11 16:47:35.620 11678-11678/? D/MainActivity: MainActivity onPause() 
04-11 16:47:35.720 11678-11678/? D/MainActivity: DialogActivity onCreate() 
04-11 16:47:35.720 11678-11678/? D/MainActivity: DialogActivity onStart() 
04-11 16:47:35.720 11678-11678/? D/MainActivity: DialogActivity onResume() 
04-11 16:47:36.030 11678-11678/? D/MainActivity: MainActivity onSaveInstanceState() 

点击back返回按键返回MainActivity发现多出如下日志信息:

04-11 16:49:06.990 11678-11678/? D/MainActivity: DialogActivity onPause() 
04-11 16:49:07.010 11678-11678/? D/MainActivity: MainActivity onResume() 
04-11 16:49:07.150 11678-11678/? D/MainActivity: DialogActivity onStop() 
04-11 16:49:07.150 11678-11678/? D/MainActivity: DialogActivity onDestroy() 

再点击返回键,推出程序 日志如下:

04-11 16:50:24.420 11678-11678/? D/MainActivity: MainActivity onPause() 
04-11 16:50:25.140 11678-11678/? D/MainActivity: MainActivity onSaveInstanceState() 
04-11 16:50:25.140 11678-11678/? D/MainActivity: MainActivity onStop() 

这就是整个的生命周期

关于生命周期你应该知道的:
这整个的生命周期中总计三个循环,四种状态,七个方法!
三个循环:
1.整个的生命周期 onCreate到onDestory
2.可见生命周期onStart到onStop
3.前台生命周期onResume到onPause 此时activity位于最前端与用户进行交互。
四种状态:
1.在屏幕前台 运行状态(running)
2.暂停状态(Paused),比如demo中的dialogActivity获得用户焦点,但是此时MainActivity还是依然可见的,此时的MainActivity的状态就叫暂停状态。
3.停止状态(Stopped) 如demo中的从MainActivity条状到NormalActivity之后Mainactivity完全被覆盖掉,此时的MainActivity就进入停止状态
4.死亡状态 ,如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,当该Activity再次显示给用户时,它就又开始了新一轮的生命周期。系统从内存删除activity时会调用该activity的onDestory方法


图片来自于网络。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值