第二章Activity
Activity介绍
1,来说一下Activity的生命周期
onCreate ---> onStart ---> onResume --->onPause--->onStop ---->onDestory
还有一个开发中不是经常用的 onRestart()
当Activity启动的时候首先会执行onCreate 接着执行onStart onStart 用户就可以看到界面了 onResume执行完后 用户就可以和界面进行交互 当一个Dialog出现在Activity上面时 Activity就会执行 onPause方法 当从一个Activity跳到另外一个Activity是就会执行onStop方法 如果从另外一个Activity界面返回到这个Activity界面并且这个Activity没有被系统回收就会调用onRestart方法 当调用Activity方法的 finish方法时就会调用onDestory方法
2,Activity的跳转
I,activity 的跳转 简单的跳转 startActivity(intent);
II,activity 的 有返回值的跳转 startActivityForResult(intent, REQUEST_CODE);
第二种跳转方式需要重新protected void onActivityResult(int requestCode, int resultCode, Intent data);方法
3,系统回收activity时 会调用 onSaveInstanceState 在此方法中可以保存数据的存储状态
4,退出 activity 和 application
2.1之前 用 activityManager的 restartPackage方法 要添加 android. Permission. PRESTART_PACKAGES
2.1之后 记录打开的activity 在需要退出时 关闭每一个 activity 也可以发送广播
5,Intent 的说明
² action 动作指令 它决定了跳转到那个Activity(要与manifest配置的相同属于隐式匹配)
² data 数据 它只是提供了 数据的地址 类似于门牌号 在android中 表现为一个uri eg:content://xxxx 总而言之是能够清楚的描述一个数据地址的uri
² type text/plain data就是门牌号 指明了具体的位置 而type则是强调物以类聚
² category 种类分类 范畴 给意图 附加上一个约束 所有的Activity都接受一个category为CATEGORY_LAUNCHER action 为ACTION_Main的意图
² component 组件 零件 可以去调动第三方的 开发的程序
Intent的 数据 传递
一、Extras【附加设备;额外部分;另外收费的部分(extra的复数)】它就是一个Bundle对象
二、Flags 标志 用来指明运行的模式 eg: FLAG_ACTIVITY_NEW_TASK
6,任务 ,进程 ,线程 ,实现
1,任务
Ø android 组件中 有一个Task【任务】 作用:将组件之间的连接 从进程的概念的细节中剥力出来
Ø Task 简单的说 就相当于应用程序 application的概念 就是 一组以栈的模式聚集在一起的Activity组件的集合
Ø 他们有潜在的前后驱关联 新加入的Activity组件 位于栈顶 并仅有在栈顶的Activity才有机会与用户进行交换
Ø 而当栈顶的Activity完成使命退出的时候,Task会将其退栈,并让下一个将跑到栈顶的Activity来于用户面对面,直至栈中再无更多Activity,Task结束
Ø Task 的四中模式【standard,singleTop,singleTask,singleInstance】 standard 是默认的
2,进程
Ø android 基于RPC来通信 在android 底层 进程构造了底部的一个运行池 不仅是Task 中的各个Activity 组件 还有service contentProvider BroadCastReceiver都是寄宿在底层某个进程中 进行运转
Ø 在Android中,整体的<application>将影响其中各个组件 和底下各个组件,都可以设置<process>属性,相同<process>属性的组件将扔到同一个进程中运行
Ø android进程的五个等级 foreground process , visible process, service process, background process, empty process
Ø Android核心会将其上Activity组件的Bundle对象持久化到磁盘上,当用户回到该Activity时候,系统会重新构造该组件,并将持久化到磁盘上的Bundle对象恢复。有了这样的持久化的状态信息,开发人员可以很好的区分具体死法,并有机会的使得死而复生的Activity恢复到死前状态。开发者应该做的,是通过onSaveInstanceState函数把需要维系的状态信息(在默认的状态下,系统控件都会自己保存相关的状态信息,比如TextView,会保存当前的Text信息,这都不需要开发人员担心...),写入到Bundle对象,然后在onRestoreInstanceState函数中读取并恢复相关信息(onCreate,onStart,也都可以处理...)。
3,线程
Ø 读取数据,后台处理,这些猥琐的伙计,自然少不了线程的参与。在Android核心的调度层面,是不屑于考量线程的,它关注的只有进程,每一个组件的构造和处理,都是在进程的主线程上做的,这样可以保证逻辑的足够简单。多线程,往往都是开发人员需要做的。
Ø Android的线程,也是通过派生Java的Thread对象,实现Run方法来实现的。但当用户需要跑一个具有消息循环的线程的时候,Android有更好的支持,来自于Handler和Looper。Handler做的是消息的传送和分发,派生其handleMessage函数,可以处理各种收到的消息,和win开发无异。Looper的任务,则是构造循环,等候退出或其他消息的来临。在Looper的SDK页面,有一个消息循环线程实现的标准范例,当然,更为标准的方式也许是构造一个HandlerThread线程,将它的Looper传递给Handler。
Ø 在Android中,Content Provider的使用,往往和线程挂钩,谁让它和数据相关呢。在前面提到过,Content Provider为了保持更多的灵活性,本身只提供了同步调用的接口,而由于异步对Content Provider进行增删改查是一个常做操作,Android通过AsyncQueryHandler对象,提供了异步接口。这是一个Handler的子类,开发人员可以调用startXXX方法发起操作,通过派生onXXXComplete方法,等待执行完毕后的回调,从而完成整个异步调用的流程,十分的简约明了。
4,实现
Ø 整个任务、进程管理的核心实现,尽在ActivityManagerService中。上面说到,Intent解析,就是这个ActivityManagerService来负责的,其实,它是一个很名不副实的类,因为虽然名为Activity的Manager Service,但它管辖的范围,不只是Activity,还有其他三类组件,和它们所在的进程。
Ø 在ActivityManagerService中,有两类数据结构最为醒目,一个是ArrayList,另一个是HashMap。ActivityManagerService有大量的ArrayList,每一个组件,会有多个ArrayList来分状态存放。调度工作,往往就是从一个ArrayList里面拿出来,找个方法调一调,然后扔到另一个ArrayList里面去,当这个组件没对应的ArrayList放着的时候,说明它离死不远了。HashMap,是因为有组件是需要用名字或Intent信息做定位的,比如Content Provider,它的查找,都是依据Uri,有了HashMap,一切都顺理成章了。
Ø ActivityManagerService用一些名曰xxxRecord的数据结构,来表达各个存活的组件。于是就有了,HistoryRecord(保存Activity信息的,之所以叫History,是相对Task栈而言的...),ServiceRecord,BroadcastRecord,ContentProviderRecord,TaskRecord,ProcessRecord,等等。
Ø 值得注意的,是TaskRecord,我们一直再说,Task栈这样的概念,其实,真实的底层,并不会在TaskRecord中,维系一个Activity的栈。在ActivityManagerService中,各个任务的Activity,都以HistoryRecord的形式,集中存放在一个ArrayList中,每个HistoryRecord,会存放它所在TaskRecord的引用。当有一个Activity,执行完成,从概念上的Task栈中退出,Android是通过从当前HistoryRecord位置往前扫描同一个TaskRecord的HistoryRecord来完成的。这个设计,使得上层很多看上去逻辑很复杂的Task体系,在实现变得很统一而简明,值得称道。
Ø ProcessRecord,是整个进程托管实现的核心,它存放有运行在这个进程上,所有组件的信息,根据这些信息,系统有一整套的算法来决议如何处置这个进程,如果对回收算法感兴趣,可以从ActivityManagerService的trimApplications函数入手来看。
Ø 对于开发者来说,去了解这部分实现,主要是可以帮助理解整个进程和任务的概念,如果觉得这块理解的清晰了,就不用去碰ActivityManagerService这个庞然大物了。