zoukankan      html  css  js  c++  java
  • Android中Activity完全解析

    Activity的生命周期

    1.Activity几种状态

    1、Active(活动):当Activity位于栈顶时,它是可见,有焦点的前台Activity,可以用来响应用户的输入。

    2、Paused(暂停):一般情况,你的Activity可见但不具有焦点,例如 当前面的Activity是全透明或非透明的Activity时,下面的Activity就位于Paused状态。

    3、Stopped(停止):当一个Activity彻底不可见时,就处于这个状态。此时Activity完全不可见,但在内存中仍旧保留该Activity的状态和成员信息。

    4、Inactive(销毁):当一个Activity被杀死时,就变成Inactive。Inactive Activity会从Activity栈中移除,如果重新显示需要重新启动。一般销毁由系统Dalvik控制。

    8468031

    2、Activity生命周期每个函数的解析

    1、onCreate(Bundle saveInstanceState)

    该函数是该Activity第一次启动时调用,且启动后就不在执行,除非由于系统内存紧张,把处于Paused和Stopped状态下的Activity回收,然后再重新启动。

    它有个形式参数saveInstanceState,它主要保存Activity由于系统内存不足等原因,被系统隐式销毁Activity,在被销毁之前一般的会调用onSaveInstanceState(),保留该Activity此时的状态信息。该方法中传入Bundle参数,系统会保留,当再次启动时,通过onCreate()方法传入。

    2、onStart()

    一般情况下,该方法是在onCreate()之后调用或者在Stopped状态返回时调用。用户重新查看窗体时会执行。

    3、onResume()

    启动过程成执行onCreate()-->onStart()-->onResume()或者 当Activity处于Stopped状态onStopped()-->onResume()

    当Activity处于Paused状态时onPause()-->onResume()

    4、onPause()

    一般窗体被交换到后台时执行onPause(),一般在onPause()中保存永久性数据。

    5、onStop()

    onPause()-->onStop()。  Activity页面切换,或者用户直接按Back键,将该窗体从当前任务重移除,也会执行onStop()

    6、onRestart()

    onStop()执行之后,该窗体和进程没有被系统销毁,此时用户又重新查看该窗体,则会执行窗体的onRestart()--->onStart()

    7、onDestroy()

    Activity被销毁时执行onDestroy()。

    Activity的四种加载模式

    1.Activity栈

    Android采用Task来管理多个Activity,当我们启动一个应用时,Activity就会为之创建一个Task,然后启动这个应用的入口Activity(即intent-filter中配置为MAIN和LAUNCHER的Activity)。

    我们可以把Task理解为Activity栈。Task以栈的形式来管理Activity,根据栈“先进后出”的原则,先启动的Activity被压入栈底,后启动的Activity放在栈顶。如果我们按Back键,则最上面的Activity被弹出栈。

    2、四种加载模式

    配置Activity时可以指定android:launchMode属性,用于配置Activity的加载模式

    1、standard  :默认加载模式(始终创建新实例)

    启动目标Activity时,总会为该Activity创建一个新的实例,并放入当前的Task的栈顶中。

    2、singleTop:顶单例模式(栈顶有实例则不再创建新实例)

    启动目标Activity时,若已经有一个目标Activity位于栈顶,则不会创建新的目标Activity实例,而是复用原有的。

    若没有目标Activity位于栈顶,则会创建一个新的目标Activity实例,并添加至当前Task的栈顶。

    3、singleTask:内单例模式(保持一个Task内只有一个实例)

    若当前Task内不存在目标Activity实例,则会创建一个新的目标Activity实例,并添加至当前Task的栈顶。

    启动目标Activity时,若已经有一个目标Activity实例位于栈顶,则不会创建新的目标Activity实例,而是复用原有的。

    启动目标Activity时,若当前Task内已经有一个目标Activity实例,但不位于栈顶,则会移除该实例上面的所有Activity,从而使该实例转入栈顶。

    4、singleInstance 全局单例模式(保持所有Task内只有一个实例,且用一个单独的Task栈放这个实例)

    若目标Activity的实例不存在,则会创建一个全新的Task,再创建一个该Activity的实例,并将其加入新Task的栈顶。

    若已经存在,则会将该实例所在的Task转到前台。

    启动、关闭Activity

    启动其他Activity:startActivity(Intent intent)

    关闭当前Activity:finish()

    startActivityForResult的使用

    A-Activity需要在B-Activtiy中执行一些数据操作,跳转至B-Activity后,B-Activity要将执行操作数据的结果返回给A-Activtiy,此时就需要使用 startActivityForResult()来启动B-Activity了。

    使用的三个函数:

    startActivityForResult(Intent intent, Int requestCode)
    setResut(int resultCode, Intent intent)
    onActivityResult(int requestCode, int resultCode, Intent intent)

    步骤:

    1、在A中跳转的时候不是采用startActivity(intent) 这个方法,而是startActivityForResult(intent, Int requestCode)的形式,requestCode可以是大于等于0的任何值。

    startActivityForResult(intent, 0);

    2、在A中重写onActivityResult方法,用来接收B回传的数据,因为传回来的resultCode不同而做差别处理。

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (resultCode) { //resultCode为回传的标记
       case 
    20
    :
        Bundle b=data.getExtras(); //data为B中回传的Intent
        String str=b.getString("str1");//str即为回传的值
        break;
    default:
        break;
        }
    }
    
    

    3、在B中采用setResult方法,并且之后要调用finish方法。

    Intent intent=new Intent();  
    intent.putExtra("str1", str_bookname);  
    setResult(20, data);  
    finish(); //关闭掉这个Activity 

    使用Bundle在Activity间传值

    Activity使用Bundle包来携带数据,Bundle对象有如下方法:

    putXxx(String key,Xxx data) : 向Bundle中放入int、String等各种类型的数据

    putSerializable(String key,Serializable data) : 向Bundle中放入可序列化的对象

    getXxx(String key):取出int、String等各种类型的数据

    getSerializable(String key):取出可序列化的对象

    当然我们还可以直接调用intent对象的putExtra(String key,Xxx data)方法存入数据,但其本质还是创建或使用了Bundle对象进行传值。

  • 相关阅读:
    Mac下各种编程环境的配置问题(python java)
    hackintosh和windows时区问题
    CAN波特率计算公式
    Jetson nano 安装 TensorFlow
    python逻辑运算符优先级
    CSS知识点(一)
    HTML标签(二)
    python2与python3的区别
    HTML标签(一)
    IO多路复用和协程
  • 原文地址:https://www.cnblogs.com/shinefy/p/3956137.html
Copyright © 2011-2022 走看看