android开发必备 Activity zhangguangtao

第二章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方法 

 

2Activity的跳转

   Iactivity 的跳转 简单的跳转  startActivityintent;

   IIactivity 的 有返回值的跳转 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  也可以发送广播 

 

5Intent 的说明  

² action 动作指令    它决定了跳转到那个Activity(要与manifest配置的相同属于隐式匹配)

² data  数据 它只是提供了 数据的地址 类似于门牌号 在android中 表现为一个uri egcontent://xxxx  总而言之是能够清楚的描述一个数据地址的uri

² type  text/plain data就是门牌号 指明了具体的位置  而type则是强调物以类聚

² category 种类分类 范畴 给意图 附加上一个约束 所有的Activity都接受一个categoryCATEGORY_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来于用户面对面,直至栈中再无更多ActivityTask结束

Ø Task 的四中模式【standardsingleTopsingleTasksingleInstance】 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函数中读取并恢复相关信息(onCreateonStart,也都可以处理...)。

3,线程

Ø 读取数据,后台处理,这些猥琐的伙计,自然少不了线程的参与。在Android核心的调度层面,是不屑于考量线程的,它关注的只有进程,每一个组件的构造和处理,都是在进程的主线程上做的,这样可以保证逻辑的足够简单。多线程,往往都是开发人员需要做的。 

Ø Android的线程,也是通过派生JavaThread对象,实现Run方法来实现的。但当用户需要跑一个具有消息循环的线程的时候,Android有更好的支持,来自于HandlerLooperHandler做的是消息的传送和分发,派生其handleMessage函数,可以处理各种收到的消息,和win开发无异。Looper的任务,则是构造循环,等候退出或其他消息的来临。在LooperSDK页面,有一个消息循环线程实现的标准范例,当然,更为标准的方式也许是构造一个HandlerThread线程,将它的Looper传递给Handler

Ø 在Android中,Content Provider的使用,往往和线程挂钩,谁让它和数据相关呢。在前面提到过,Content Provider为了保持更多的灵活性,本身只提供了同步调用的接口,而由于异步对Content Provider进行增删改查是一个常做操作,Android通过AsyncQueryHandler对象,提供了异步接口。这是一个Handler的子类,开发人员可以调用startXXX方法发起操作,通过派生onXXXComplete方法,等待执行完毕后的回调,从而完成整个异步调用的流程,十分的简约明了。

 

  4实现

Ø 整个任务、进程管理的核心实现,尽在ActivityManagerService中。上面说到,Intent解析,就是这个ActivityManagerService来负责的,其实,它是一个很名不副实的类,因为虽然名为ActivityManager Service,但它管辖的范围,不只是Activity,还有其他三类组件,和它们所在的进程。

Ø 在ActivityManagerService中,有两类数据结构最为醒目,一个是ArrayList,另一个是HashMapActivityManagerService有大量的ArrayList,每一个组件,会有多个ArrayList来分状态存放。调度工作,往往就是从一个ArrayList里面拿出来,找个方法调一调,然后扔到另一个ArrayList里面去,当这个组件没对应的ArrayList放着的时候,说明它离死不远了。HashMap,是因为有组件是需要用名字或Intent信息做定位的,比如Content Provider,它的查找,都是依据Uri,有了HashMap,一切都顺理成章了。

Ø ActivityManagerService用一些名曰xxxRecord的数据结构,来表达各个存活的组件。于是就有了,HistoryRecord(保存Activity信息的,之所以叫History,是相对Task栈而言的...),ServiceRecordBroadcastRecordContentProviderRecordTaskRecordProcessRecord,等等。 

Ø 值得注意的,是TaskRecord,我们一直再说,Task栈这样的概念,其实,真实的底层,并不会在TaskRecord中,维系一个Activity的栈。在ActivityManagerService中,各个任务的Activity,都以HistoryRecord的形式,集中存放在一个ArrayList中,每个HistoryRecord,会存放它所在TaskRecord的引用。当有一个Activity,执行完成,从概念上的Task栈中退出,Android是通过从当前HistoryRecord位置往前扫描同一个TaskRecordHistoryRecord来完成的。这个设计,使得上层很多看上去逻辑很复杂的Task体系,在实现变得很统一而简明,值得称道。

Ø ProcessRecord,是整个进程托管实现的核心,它存放有运行在这个进程上,所有组件的信息,根据这些信息,系统有一整套的算法来决议如何处置这个进程,如果对回收算法感兴趣,可以从ActivityManagerServicetrimApplications函数入手来看。

Ø 对于开发者来说,去了解这部分实现,主要是可以帮助理解整个进程和任务的概念,如果觉得这块理解的清晰了,就不用去碰ActivityManagerService这个庞然大物了。

 

  

          

 

原文地址:https://www.cnblogs.com/zhangguangtao/p/3186696.html