zoukankan      html  css  js  c++  java
  • 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这个庞然大物了。

     

      

              

     

  • 相关阅读:
    手机号码正则表达式
    POJ 3233 Matrix Power Series 矩阵快速幂
    UVA 11468
    UVA 1449
    HDU 2896 病毒侵袭 AC自动机
    HDU 3065 病毒侵袭持续中 AC自动机
    HDU 2222 Keywords Search AC自动机
    POJ 3461 Oulipo KMP模板题
    POJ 1226 Substrings KMP
    UVA 1455 Kingdom 线段树+并查集
  • 原文地址:https://www.cnblogs.com/zhangguangtao/p/3186696.html
Copyright © 2011-2022 走看看