zoukankan      html  css  js  c++  java
  • Android学习整理之Activity生命周期篇

    一、Activity生命周期说明

       Activity的四种状态:

      ⒈活动状态(Active or Running):也称为运行状态,处于Activity栈顶,在用户界面中最上层,完全能被用户看到,能够与用户进行交互;

      ⒉ 暂停状态(Paused):Activity失去焦点,Activity界面被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,与窗口管理器保持连接),但是在系统内存不够用的时候将被杀掉;
      ⒊停止状态(Stopped):Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡,但它依然保持所有状态和成员信息,只是它不再可见,它的窗口被隐藏;
      ⒋非活动状态(Killed):当系统内存需要被用在其他地方的时候,一个停止状态的Activity被杀掉。
      如果一个Activity是Paused或者Stopped状态时可以被恢复,也可以被删除。一个被删除(杀掉)的Activity如果需要重新恢复就需要重启。

      当一个activity的当前状态发生改变时,当前activity就会触发一系列的回调方法。这些回调方法很明白的阐述了activity生命周期的变化过程。

      这些方法分别为:onCreat();onstart();onResume;onPause();onStop();onRestart();onDestroy();

    二、生命周期图解说明

     

    这张图,相信学习过android开发的大牛们都非常的熟悉了,但我还是图解一下:

    1、当一个activity启动时,首先会调用onCreat();方法,然后调用onStart();方法,接下来调用onResume();方法。进入activity界面,此时的activity处于Running状态。

    2、当一个不是全屏的activity被启动时(即当前activity被不完全遮住,dialog除外),那么当前activity首先会执行onPause();方法,当不是全屏的activity被从栈顶移除是,那么activity会执行onResume();方法。

    3、当当前activity被新的activity完全覆盖时,或者按home回到主界面时,当前activity会执行,onPause(),onStop();方法,当回到当前activity时,会执行onRestart();onstart();onResume();方法。

    4、当用户退出当前activity时会执行onPause();onStop();最后执行onDestroy();方法。

    三、程序示例解释说明

     

      1 package org.david.activitylifecycle;
      2 
      3 import android.os.Bundle;
      4 import android.app.Activity;
      5 import android.content.Intent;
      6 import android.util.Log;
      7 import android.view.View;
      8 import android.view.View.OnClickListener;
      9 import android.widget.Button;
     10 
     11 public class MainActivity extends Activity implements OnClickListener {
     12 
     13     private static final String TAG = MainActivity.class.getSimpleName();
     14     private Button btn_next, btn_halfActivity;
     15 
     16     @Override
     17     protected void onCreate(Bundle savedInstanceState) {
     18         super.onCreate(savedInstanceState);
     19         Log.i(TAG, "onCreate()");
     20         setContentView(R.layout.activity_main);
     21 
     22         // init---view
     23         btn_next = (Button) findViewById(R.id.btn_next);
     24         btn_halfActivity = (Button) findViewById(R.id.btn_halfActivity);
     25         btn_next.setOnClickListener(this);
     26         btn_halfActivity.setOnClickListener(this);
     27 
     28     }
     29 
     30     @Override
     31     public void onClick(View v) {
     32         switch (v.getId()) {
     33         case R.id.btn_next:
     34             Intent intent = new Intent(this, SecondActivity.class);
     35             startActivity(intent);
     36             break;
     37         case R.id.btn_halfActivity:
     38             Intent intent2 = new Intent(this,HalfActivity.class);
     39             startActivity(intent2);
     40             break;
     41 
     42         }
     43     }
     44 
     45     @Override
     46     protected void onStart() {
     47         super.onStart();
     48         Log.i(TAG, "onstart()");
     49     }
     50 
     51     @Override
     52     protected void onRestart() {
     53         super.onRestart();
     54         Log.i(TAG, "onRestart()");
     55     }
     56 
     57     @Override
     58     protected void onResume() {
     59         super.onResume();
     60         Log.i(TAG, "onResume()");
     61     }
     62 
     63     @Override
     64     protected void onPause() {
     65         super.onPause();
     66         Log.i(TAG, "onPause()");
     67     }
     68 
     69     @Override
     70     protected void onStop() {
     71         super.onStop();
     72         Log.i(TAG, "onStop()");
     73     }
     74 
     75     @Override
     76     protected void onDestroy() {
     77         super.onDestroy();
     78         Log.i(TAG, "onDestroy()");
     79     }
     80 
     81     @Override
     82     protected void onRestoreInstanceState(Bundle savedInstanceState) {
     83         super.onRestoreInstanceState(savedInstanceState);
     84         Log.i(TAG, "onRestoreInstanceState()");
     85     }
     86 
     87     @Override
     88     protected void onNewIntent(Intent intent) {
     89         super.onNewIntent(intent);
     90         Log.i(TAG, "onNewIntent()");
     91     }
     92 
     93     @Override
     94     protected void onSaveInstanceState(Bundle outState) {
     95         super.onSaveInstanceState(outState);
     96         Log.i(TAG, "onSaveInstanceState()");
     97     }
     98     
     99 
    100 }

    1、当前activity启动:

    2、当启动一个新的activity,或者按home键:

    注意:onSaveInstanceState();方法在onStop()之前调用,在onPause()之后调用。

       这个地方与我之前看到过的一篇博客有出入,难道是sdk版本的问题?希望有知道的朋友给我解答下。

    3、再次回到当前activity时,即由后台转到前台:

    4、修改HalfActivity在AndroidManifest.xml中的配置,将android:theme属性设置为@android:style/Theme.Dialog。使之成为一个不全屏的activity。

    有当前activity进入到HalfActivity:

    再由HalfActivity退回当前activity:

    5、当屏幕发生变化时,activity的生命周期也是会发生变化的。由竖屏----->横评和由横评----->竖屏生命周期的变化是一样的:

    总结:理解生命周期对我们处理交互界面有大的帮助,同时也能使我们的程序更加的健壮。希望我们都能够有一个很好的理解。

    补充:上篇中的activity的数据传递遗漏一种情况,这里补充一下:startActivityForResult(Intent, int);

    MainActivity.java

    1 Intent intent2 = new Intent(this,HalfActivity.class);
    2             startActivityForResult(intent2, REQUEST_OK);
    1     @Override
    2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    3         super.onActivityResult(requestCode, resultCode, data);
    4         if(requestCode==REQUEST_OK){
    5             String getData = data.getStringExtra("hello");
    6             System.out.println(getData);
    7         }
    8     }

    HalfActivity.java

    1 tv_hello=(TextView) findViewById(R.id.tv_hello);
    2         Intent intent = new Intent();
    3         intent.putExtra("hello", tv_hello.getText().toString());
    4         setResult(MainActivity.REQUEST_OK, intent);

    感悟:北京已经连续一个星期的雾霾天气了,真心是让人感到心烦啊!!!

  • 相关阅读:
    基本MVVM 和 ICommand用法举例(转)
    WPF C# 命令的运行机制
    628. Maximum Product of Three Numbers
    605. Can Place Flowers
    581. Shortest Unsorted Continuous Subarray
    152. Maximum Product Subarray
    216. Combination Sum III
    448. Find All Numbers Disappeared in an Array
    268. Missing Number
    414. Third Maximum Number
  • 原文地址:https://www.cnblogs.com/dividxiaoshuo-fighting/p/3566570.html
Copyright © 2011-2022 走看看