• [安卓基础] 009.组件Activity详解


    组件Activity详解

    这篇文章学到得内容
    1、什么是Activity
    2、Activity的生命周期
    3、如何保存Activity的状态
    4、Activity之间切换时,相互之间生命周期的执行顺序
    

    什么是Activity

    Activity是Android用来和用户进行界面交互的组件。比如,你用android手机打电话,查看地图,玩游戏,都是在已经写好的Activity上操作的。如果拿生活中最常见的举例子,Activity相当于一个网页,上面有许多的按钮和布局和图片。所以,在android的机制里,Activity是最常用的一个组件。它可大可小,就像网页一样,可以占据怎个屏幕,也可以只占据屏幕的某一部分。

    一个app通常会有多个Activity组合起来,他们互相松散的关联,互相调用。从用户的角度来看,通常表现为页面(Activity)在屏幕上的切换。在这众多的Activity中,会有一个Activity是入口Activity,也就是用户打开App,第一个看到的Activity。这个主入口Activity,我们在AndroidManifest.xml可以通过以下代码注册,告知系统说,这个Activity是主入口Activity。

        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.babybus.study.activities.MainActivity"
                android:label="@string/app_name" >
                <!-- 标志这个activity是主入口activity -->
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
             <activity 
                 android:name="com.babybus.study.activities.SecondActivity"
                 android:label="@string/app_name" ></activity>
        </application>

    当一个activity被创建或者销毁时,会被通知执行许多类似callback机制的方法。这些方法,就是我们熟悉的生命周期方法。如:onStart()、onCreate()、onResume()、onPause()、onStop()、onDestory()。你可以在这些回调方法里,写一些Activity处于这个时刻要执行的代码。

    学习Activity,要掌握三个:

    1、掌握在Activity上面进行界面布局(这里不讲)。  
    2、掌握Activity的生命周期。  
    3、如何保存Activity的状态,当Activity挂在后台时。 
    

    Activity的生命周期

    这里主要的,是要告诉大家Activity的生命周期机制。界面布局,后面再介绍。

    当一个Activity被创建的时候,要按照生命周期机制来执行一系列生命周期的方法。下图是Activity的生命周期机制图:



    从上面的流程图,非常直观的介绍给我们,Activity这些回调方法的执行顺序和在各种状态下的流程。

    从流程图可以总结出
    1、在Activity running,也就是在Activity在屏幕上展现出来时,它经过了三个回调方法:onCreate->onStart->onResume。
    2、当这个Activity被遮盖时,会执行onPause,如果这个Activity被完全遮盖,会执行onPause->onStop。
    3、当这个Activity从后台回来时,如果只是执行到onPause(局部被盖住),则回到onResume然后重新进入running状态,如果执行到onStop(全部遮盖),则执行onRestart,再进入onStart->onResume->Activity running。
    4、如果退出这个app,Activity会执行onDestory,因为退出app,系统会把app的内容销毁。
    5、有的时候,当Activity处在后台看不见的状态太久,也就是处于onStop的状态太久或者app内存资源不够时,这个Activity的进程会被杀死,如果这时候这个Activity要回到前台,则会进入onCreate方法开始执行。简单理解就是:因为它被销毁了,所以需要重新创建出来。
    要创建一个属于自己的Activity,需要继承一下。代码如下:

     1 package com.babybus.study.activities;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.util.Log;
     6 
     7 
     8 public class MainActivity extends Activity{
     9 
    10     private static final String TAG = "com.babybus.study.activities.MainActivity";
    11     
    12     @Override
    13     protected void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         Log.i(TAG, "onCreate");
    16         setContentView(R.layout.activity_main);
    17 
    18     }
    19     
    20     @Override
    21     protected void onRestoreInstanceState(Bundle savedInstanceState) {
    22         Log.i(TAG, "onRestoreInstanceState");
    23         super.onRestoreInstanceState(savedInstanceState);
    24     }
    25     
    26     @Override
    27     protected void onSaveInstanceState(Bundle outState) {
    28         Log.i(TAG, "onSaveInstanceState");
    29         super.onSaveInstanceState(outState);
    30     }
    31     
    32     @Override
    33     protected void onStart() {
    34         Log.i(TAG, "onStart");
    35         super.onStart();
    36     }
    37     
    38     @Override
    39     protected void onRestart() {
    40         Log.i(TAG, "onRestart");
    41         super.onRestart();
    42     }
    43     
    44     @Override
    45     protected void onPause() {
    46         Log.i(TAG, "onPause");
    47         super.onPause();
    48     }
    49     
    50     @Override
    51     protected void onStop() {
    52         Log.i(TAG, "onStop");
    53         super.onStop();
    54     }
    55     
    56     @Override
    57     protected void onDestroy() {
    58         Log.i(TAG, "onDestroy");
    59         super.onDestroy();
    60     }
    61 }

    如何保存Activity的状态

    当Activity被挂在后台的时候,最重要的就是保存它的状态啦。等到Activity恢复的时候,再把保存的状态还原回来。接下来介绍如何保存Activity的状态。在这里,记住几个关键点
    1、当Activity挂在后台时,它处在onPause或者onStop,虽然此时Activity不可见,但它依然处在手机的运行的内存中,它还活着。虽然你看不见,所以,当进入onPause或者onStop的时候,我们需要保存此刻Activity的状态。当恢复的时候再显示出来。
    2、然而,当因为手机内存不够的原因,Activity会被回收,这种情况下,就比较麻烦,如果没有被回收,系统会帮助我们保存Activity当前的状态,但如果被回收了,这个状态,就要我们自己来恢复。这个时候,就用到系统提供给我们的这个方法:onSaveInstanceState()。
    3、使用onSaveInstanceState()来保存状态,需要用到一个东西:Bundle,可以用键值的方式,把需要保存的信息,通过Bundle保存下来。

     1     @Override
     2     protected void onCreate(Bundle savedInstanceState) {
     3         super.onCreate(savedInstanceState);
     4         Log.i(TAG, "onCreate");
     5         // 可以在这里获得保存下来的数据
     6         if (savedInstanceState != null) { // savedInstanceState有可能是null,因为如果第一次打开,或者activity没有被杀死,是不需要用到这个的。
     7             String value1 = savedInstanceState.getString("key1");
     8             String value2 = savedInstanceState.getString("key2");
     9             String value3 = savedInstanceState.getString("key3");
    10             System.out.println("--bb-- (value1, value2, value3) = (" + value1 + ", " + value2 + ", " + value3 + ")");
    11         }
    12 
    13         setContentView(R.layout.activity_main);
    14         
    15     }
    16     
    17     @Override
    18     protected void onRestoreInstanceState(Bundle savedInstanceState) {
    19         Log.i(TAG, "onRestoreInstanceState");
    20         // 也可以在这里获得保存下来的数据,当然这个方法在onCreate之后、onStart之前被执行
    21         if (savedInstanceState != null) { // savedInstanceState有可能是null,因为如果第一次打开,或者activity没有被杀死,是不需要用到这个的。
    22             String value1 = savedInstanceState.getString("key1");
    23             String value2 = savedInstanceState.getString("key2");
    24             String value3 = savedInstanceState.getString("key3");
    25             System.out.println("--bb-- (value1, value2, value3) = (" + value1 + ", " + value2 + ", " + value3 + ")");
    26         }
    27         super.onRestoreInstanceState(savedInstanceState);
    28     }
    29     
    30     @Override
    31     protected void onSaveInstanceState(Bundle outState) {
    32         Log.i(TAG, "onSaveInstanceState");
    33         // 这个方法会在onPause和onStop之间被调用
    34         // 这个方法里保存数据
    35         String value1 = "a";
    36         String value2 = "b";
    37         String value3 = "c";
    38         outState.putString("key1", value1);
    39         outState.putString("key2", value2);
    40         outState.putString("key3", value3);
    41         super.onSaveInstanceState(outState);
    42     }

    4、如果系统因为内存不够把Activity释放掉,你可以通过Bundle把保存下来的信息,在onCreate()和onRestoreInstanceState()方法中,把这些状态重新恢复回来。

    看下保存Activity状态的流程图


    我们看到,当Activity进程没有被杀死的时候,onRestart会自动把Activity的状态恢复回来,而当进程被杀死的时候,就需要通过onCreate或者onRestoreInsrtanceState()来把状态恢复过来。

    (注意:onSaveInstanceState()这个方法不是必须被执行的,系统会根据情况(内存是否不足)来执行,当这个方法被执行的时候,它会在onPause和onStop之前。以确保状态被准确的记录下来。所以,不可以用在这个方法来存储数据,而是要在onPause方法中,储存数据,比如把它储存在数据库中。)

    在Activity中,在onCreate方法有一个参数:savedInstanceState,你可以在onCreate里,通过这个参数来获得保存下来的数据。通常,我们只要这么做就够了。但如果你希望在Activity被全部创建好后,再根据保存下来的数据做一些改变,这时候就要用到onRestoreInstanceState()方法了,这个方法执行在onCreate之后,onStart之前。

    本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 

    转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4698569.html

     

  • 相关阅读:
    Java 简单算法--打印乘法口诀(只使用一次循环)
    Java简单算法--求100以内素数
    ubuntu 16.04 chrome flash player 过期
    java 网络API访问 web 站点
    java scoket (UDP通信模型)简易聊天室
    leetcode1105 Filling Bookcase Shelves
    leetcode1140 Stone Game II
    leetcode1186 Maximum Subarray Sum with One Deletion
    leetcode31 Next Permutation
    leetcode834 Sum of Distances in Tree
  • 原文地址:https://www.cnblogs.com/superdo/p/4698569.html
Copyright © 2020-2023  润新知