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);

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

  • 相关阅读:
    2020年MongoDB 企业应用实战 基础 复制集 分片集群
    2020年Redis5.0 从入门到企业应用实战
    2020年Jumpserver1.5.8企业生产部署指南
    python单例与数据库连接池
    python 异常处理
    python 正则
    python 多线程
    python 队列
    python 闭包与装饰器
    程序员面试资源集锦
  • 原文地址:https://www.cnblogs.com/dividxiaoshuo-fighting/p/3566570.html
Copyright © 2011-2022 走看看