1 理解Activity

Activity就是一个包含应用程序界面的窗口,是Android四大组件之一。一个应用程序可以包含零个或多个Activity。一个Activity的生命周期是指从屏幕上显示那一刻起一直到最后隐藏所经历的若干阶段,理解其生命周期对确保应用程序正确的工作是极其关键的。

a.Activity的生命周期

Activity的生命周期中包含三种状态:Resumed状态、Paused状态、Stopped状态,每一个Activity都处于某一个状态。

  • Resumed状态,当Activity处于屏幕最前端,此时Actiivity完全显示在用户的界面中,并能获取焦点时,可以响应用户的的触摸屏幕等事件,此时为Resumed状态。
  • Paused状态:当Activity被其他Activity遮挡,但是仍然有部分可见,此时为Paused状态;当处于Paused状态时,Activity仍然会更新UI,但是此时不能获取焦点,即不会响应用户触摸、后退等事件。
  • Stopped状态:当Activity被另外一个Activity完全遮挡,此时为Stopped状态,Stopped状态并不意味着Activity停止运行,而可以理解为转入后台运行。但是如果系统需要内存,会优先结束停止状态的Activity释放资源,所以在Activity转入停止状态时要对重要数据进行保存。

AppCompatActivity基类定义了管理一个Activity的生命周期的一系列事件:

  • onCreate()--当Activity首次被创建时调用。
  • onstart()--当Activity对用户可见时调用,此时还不可以进行用户的交互。
  • onResume()--在onStart()方法中后调用,开始与用户进行交互。
  • onPause()--当用户进入透明的窗口时会被调用,此时可以看见但是没焦点。
  • onStop()--当Activity不对用户可见时调用。
  • onRestart()--当stop状态返回时进入该界面时调用,然后在进入onResume状态。
  • onDestroy()--在Activity被系统销毁(手动或由系统执行以节省内存)前调用。

下面两图展示了Activity生命周期:

Activity生命周期中各个状态切换:

  • 启动Activity到运行状态:onCreate() -> onStart() -> onResume() -> 界面完全显示
  • 运行状态到暂停状态:界面完全显示 -> onPause() -> 界面被部分遮盖
  • 暂停状态到运行状态:界面被部分遮盖 -> onResume() -> 界面完全显示
  • 运行状态到停止状态:界面完全显示 -> onPause() -> onStop() -> 界面完全遮盖
  • 停止状态到运行状态:界面完全遮盖 -> onRestart() -> onStart() -> onResume() -> 界面完全显示
  • 退出Activity:界面完全显示 -> onPause() -> onStop() -> 界面完全遮盖 -> onDestroy() -> Activity结束生命周期

注:当系统内存紧张时,系统可以将Activity释放掉以获取资源,优先释放停止状态的Activity,次之则是暂时状态的Activity,而运行状态的Acitivity一般不可能被强行释放,当Activity被释放时,直接转入消亡,需要注意一点的是onDestroy()并不会被执行,所以把数据保存放在onDestroy处理是不适当的,可以在onSaveInstanceState()中对重要数据进行相应的处理。

b.Activity栈

每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部。如果用户使用后退按钮返回的话,或者前台的Activity结束,活动的Activity就会被移出栈消亡,而在栈上的上一个活动的Activity将会移上来并变为活动状态。如下图所示:

2.Activity的使用

a.创建Activity

要创建一个Activity,需要创建一个以AppCompatActivity(API22)为基类的Activity类:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

然后在res/layout创建一个activity_main.xml文件,该文件用户界面组件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.androidtest.MainActivity"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/HelloWorld"
android:text="Hello World!" /> </RelativeLayout>

最后在AndroidManifest.xml中声明该活动:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidtest"> <!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" /> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

注:Android Studio创建Activity详见Android学习笔记之Android Studio添加新的Activity

Android学习笔记之Activity详解的更多相关文章

  1. Android学习笔记4——Activity详解

    在 Android 开发过程中,与程序员打交道最多的应该就是作为四大组件之一的 Activity 了.接下来我们就一起来揭开 Activity 的神秘面纱吧~ 一.概述 什么是 Activity(活动 ...

  2. Android学习笔记_21_ViewFlipper使用详解 手势识别器

    一.介绍ViewFilpper类 1.1 屏幕切换 屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面:一个个性化设置 ...

  3. Android学习笔记之Toast详解

    1. 贴一段Android API-Toast Toast public class Toast  extends Object java.lang.Object ↳ android.widget.T ...

  4. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...

  5. Android学习笔记:Activity生命周期详解

    进行android的开发,必须深入了解Activity的生命周期.而对这个讲述最权威.最好的莫过于google的开发文档了. 本文的讲述主要是对 http://developer.android.co ...

  6. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

  7. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  8. Android四大组件之Activity详解——创建和启动Activity

    前面我们已经对Activity有过简单的介绍: Android开发——初始Activity Android开发——响应用户事件 Android开发——Activity生命周期 先来看一下最终结果 项目 ...

  9. android学习笔记26——Activity

    Activity ==> android中四大组件:Activity.Service.BroadcastReceiver.ContentProvider Activity组件用于对用户呈现操作界 ...

随机推荐

  1. 数据结构(十一)B树

    之前的二叉排序树,平衡二叉树都是基于二叉树的实现,但是在搜索过程中,效率和树的深度有关,所以就想到把二叉树改为多叉树,B树和B+树都基于多叉树的实现 多路查找树 B树 定义   应用场景   B+树 ...

  2. Win10 initluictrl failed问题

    问题描述 启动win10之后,所有的软件.快捷方式无法访问,双击之后没有响应但联网正常. 解决方法 win键+S弹出选项框,选择cmd(管理员). 键入命令:netsh winsock reset c ...

  3. LightOJ 1341 Aladdin and the Flying Carpet(唯一分解定理)

    http://lightoj.com/volume_showproblem.php?problem=1341 题意:给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. 思路 ...

  4. POJ 1144 Network(无向图的割顶和桥模板题)

    http://poj.org/problem?id=1144 题意: 给出图,求割点数. 思路: 关于无向图的割顶和桥,这篇博客写的挺不错,有不懂的可以去看一下http://blog.csdn.net ...

  5. BZOJ3224 Tyvj 1728 普通平衡树(Treap)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. PHPCMSV9的CKEDITOR编辑器增加行距

    lineheight插件,下载地址:http://files.cnblogs.com/ysfng/ckeditor-lineheight.zip 第一步,下载lineheight插件,并解压到\cke ...

  7. 在Web API 2 中实现带JSON的Patch请求

    译文:http://www.cnblogs.com/kexxxfeng/p/the-patch-verb-in-web-api-2-with-json.html 原文:https://carly.io ...

  8. wget下载指定目录下的文件

    wget -r -np -k -P  ~/tmp/    http://xxx.com/download -P 表示下载到哪个目录-r 表示递归下载-np 表示不下载旁站连接.-k 表示将下载的网页里 ...

  9. Nginx 出现413 Request Entity Too Large得解决方法

    Nginx 出现413 Request Entity Too Large得解决方法 默认情况下使用nginx反向代理上传超过2MB的文件,会报错413 Request Entity Too Large ...

  10. Linux命令详解-date

    在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式:   date [ ...