当前位置: 首页 > news >正文

Android Activity

Activity是一个应用程序组件,提供用户与程序交互的界面。

 

Android 4大组件:
1. Activity  2. Service  3. BroadcastReceiver  4. Content Provider

 

Activity使用:

1.继承 Android 的 Activity类 ;

2. 重写 onCreate() 方法;

3.调用 setContentView() 方法 设置显示布局;

4.在 AndroiMainfest 文件中,注册 Activity

 

Activity的生命周期

从创建到销毁的过程

onCreate();  创建

onStart();  运行

onResume();  获取焦点

onPause();  失去焦点

onStop();  暂停

onDestroy();  销毁

onRestart();  

 

Activity的四种状态:

活动状态:(Activity/Runing)Activity处于界面最顶端,获取焦点

暂停状态:(Paused)Activity失去焦点,但对用户可见

停止状态:(Stopped)Activity被完全遮挡,但保留所有状态和成员信息

非活动状态:(Killed)Activity被停止

 

Activity从创建到销毁的生命周期:

onCreate() --> onStart --> onResume() --> onPause() --> onStop() --> onDestroy()

 

Activity从启动到后台,再到前台的生命周期:

onCreate() --> onStart --> onResume() --> onPause() --> onStop() --> onRestart() --> onStart() --> onResume()

 

Activity从启动到失去焦点,再到获取到焦点的生命周期:

onCreate() --> onStart --> onResume() --> onPause() --> onResume()

 

返回栈

Android使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这也被称为返回栈(Back Stack)。

栈是这一种先入后出的数据结构,在默认情况下,每当启动了一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。而每次按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动就会出栈,前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。

 

活动被回收了怎么办

用户A在活动A的基础上启动了活动B,活动A进入了停止状态,这个时候由于系统内存不足,将活动A回收掉了,然后用户按Back键返回活动A,此时会执行活动A的onCreate()方法,重新创建一次活动A。如果活动A中存在临时数据和状态需要保留,Activity提供了一个onSaveInstanceState()回调方法,这个方法保证在活动被回收之前一定会被调用,来解决活动被回收时临时数据得不到保存的问题。

onSaveInstanceState()方法携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,比如可以使用putString()方法保存字符串,使用putInt()方法保存整型数据。每个保存方法需要传入两个参数:第一个是键,用于后面从Bundle取值,第二个是真正要保存的内容。

如果之前有做数据保存的话,取出数据在onCreate()中调用所保存对象的saveInstanceState.getString(key)方法。

 

活动的启动模式

活动的启动模式有四种:standard、singleTop、singleTask、singleInstance,在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。

1、standard

默认的启动模式,每次启动都会创建该活动的一个新的实例。

2、singleTop

启动活动时,如发现返回栈栈顶已经是该活动,则直接使用它,不再创建新的活动实例。

不过当要启动的活动并未处于栈顶位置时,这使再启动该活动,还是会创建新的实例。

3、singleTask

当活动的启动模式指定为singleTask,每次启动活动时系统首先会在返回栈中检查是否存在该活动的实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

4、singleInstance

指定为singelInstance的活动会启用一个新的返回栈来管理这个活动,不管哪个应用程序来访问这个活动,都共用一个返回栈,解决了共享活动实例的问题。

在按Back键时,直到所有的栈都已退出,才会退出程序。

 

知晓当前对应的活动

getClass().getSimpleName()

 

随时退出程序

用一个专门的集合类对所有的活动进行管理

新建一个ActivityCollector类作为活动管理器:

public class ActivityCollector{

  public static List<Activity> activities = new ArrayList<>();

  public static void addActivity(Activity activity){

    activities.add(acitvity);

  }

  public static void removeActivity(){

    activities.remove(activity);

  }

  public static void finishAll(){

    for (Activity activity : activities){

      if (!acitvity.isFinishing()){

        activity.finish();

      }

    }

  }

}

在活动管理器中,通过一个list来暂存活动,然后提供一个addActivity()方法用于向List中添加一个活动,提供一个moveAcitvity()方法用于从List移除一个活动,最后提供一个finishAll()方法将List中存储的活动全部销毁。

BaseActivity:

public class BaseActivity extends AppcompatActivity {

  @override

  protected void onCreate(Bundle saveInstanceState) {

    super.onCreate(saveInstanceState);

    Log.d("BaseActivity", getClass().getSimpleName());

    ActivityCollector.addActivity(this);

  }

  @override

  protected void onDestory(){

    super.onDestory();

    ActivityCollectory.removeAcitvity(this);

  }

}

 

以后,不管想在什么地方退出程序,只需调用ActivityCollector.finishAll()方法就可以了。

还可以在销毁所有活动的代码后面加上杀掉当前进程的代码,以保证程序完全退出:

android.os.Process.killProcess(android.os.Process.myPid());

其中,killPrecess()方法用于杀掉一个进程,它接收一个进程id参数,可以通过myPid()方法来获得当前的进程id。

 

转载于:https://www.cnblogs.com/weiguang/p/6677712.html

相关文章:

  • Markdown 语法简单说明
  • iOS数据存储到本地的几种方法
  • linux awk(9)命令详解
  • 色情病毒“魅影杀手”的恶意行为及黑产利益链分析
  • 初学UML之-------用例图
  • Django接受ajax传过来的数组
  • 服务端构架干货:快节奏多人游戏的技术实现
  • SpringMVC -- 梗概--源码--贰--下载
  • 对学习Linux有帮助的4点纯干货建议
  • 网络安装Ubuntu16.04
  • JS存在性
  • Linux系统下磁盘分区与管理
  • CSS基础知识
  • 图解WebGLThree.js工作原理
  • 《JAVA程序设计与实例》记录与归纳--继承与多态
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • If…else
  • javascript从右向左截取指定位数字符的3种方法
  • Rancher如何对接Ceph-RBD块存储
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue 重置组件到初始状态
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 编写符合Python风格的对象
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 前端之Sass/Scss实战笔记
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用 Docker 部署 Spring Boot项目
  • 数组大概知多少
  • 详解移动APP与web APP的区别
  • Java总结 - String - 这篇请使劲喷我
  • 交换综合实验一
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​香农与信息论三大定律
  • #前后端分离# 头条发布系统
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (C语言)fgets与fputs函数详解
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)用.Net的File控件上传文件的解决方案
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ***通过什么方式***网吧
  • .gitignore文件_Git:.gitignore
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net 路由处理厉害了
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net操作Excel出错解决
  • .net打印*三角形
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET命令行(CLI)常用命令
  • .NET企业级应用架构设计系列之技术选型