zoukankan      html  css  js  c++  java
  • [安卓基础] 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

     

  • 相关阅读:
    line-height:150%和line-height:1.5的区别
    javascript: with 表单验证
    CSS实现背景透明,文字不透明,兼容所有浏览器
    关于伪类元素:before和:after
    图片预览实例分享
    微信浏览器取消缓存的方法
    学习笔记(四):jQuery之动画效果
    学习笔记(三):jQuery之DOM
    Git 常用命令
    开发规范(三)数据库 By 阿里
  • 原文地址:https://www.cnblogs.com/superdo/p/4698569.html
Copyright © 2011-2022 走看看