zoukankan      html  css  js  c++  java
  • android152 笔记 4

    42. Android中Task任务栈的分配。
    首先我们来看下Task的定义,Google是这样定义Task的:a task is what the user experiences as an "application." It's a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 这意思就是说Task实际上是一个Activity栈,通常用户感受的一个Application就是一个Task。从这个定义来看,Task跟Service或者其他Components是没有任何联系的,它只是针对Activity而言的。
    Activity有不同的启动模式, 可以影响到task的分配
    Task,简单的说,就是一组以栈的模式聚集在一起的Activity组件集合。它们有潜在的前后驱关联,新加入的Activity组件,位于栈顶,并仅有在栈顶的Activity,才会有机会与用户进行交互。而当栈顶的Activity完成使命退出的时候,Task会将其退栈,并让下一个将跑到栈顶的Activity来于用户面对面,直至栈中再无更多Activity,Task结束。

    事件

    Task栈(粗体为栈顶组件)

    点开Email应用,进入收件箱(Activity A

    A

    选中一封邮件,点击查看详情(Activity B

    AB

    点击回复,开始写新邮件(Activity C

    ABC

    写了几行字,点击选择联系人,进入选择联系人界面(Activity D

    ABCD

    选择好了联系人,继续写邮件

    ABC

    写好邮件,发送完成,回到原始邮件

    AB

    点击返回,回到收件箱

    A

    退出Email程序

    null

    如上表所示,是一个实例。从用户从进入邮箱开始,到回复完成,退出应用整个过程的Task栈变化。这是一个标准的栈模式,对于大部分的状况,这样的Task模型,足以应付,但是,涉及到实际的性能、开销等问题,就会变得残酷许多。
    
    比如,启动一个浏览器,在Android中是一个比较沉重的过程,它需要做很多初始化的工作,并且会有不小的内存开销。但与此同时,用浏览器打开一些内容,又是一般应用都会有的一个需求。设想一下,如果同时有十个运行着的应用(就会对应着是多个Task),都需要启动浏览器,这将是一个多么残酷的场面,十个Task栈都堆积着很雷同的浏览器Activity,
    是多么华丽的一种浪费啊。
    于是你会有这样一种设想,浏览器Activity,可不可以作为一个单独的Task而存在,不管是来自那个Task的请求,浏览器的Task,都不会归并过去。这样,虽然浏览器Activity本身需要维系的状态更多了,但整体的开销将大大的减少,这种舍小家为大家的行为,还是很值得歌颂的
    standard", "singleTop", "singleTask", "singleInstance"。
    
    standard模式, 是默认的也是标准的Task模式,在没有其他因素的影响下,使用此模式的Activity,会构造一个Activity的实例,加入到调用者的Task栈中去,对于使用频度一般开销一般什么都一般的Activity而言,standard模式无疑是最合适的,因为它逻辑简单条理清晰,所以是默认的选择。
    
    而singleTop模式,基本上于standard一致,仅在请求的Activity正好位于栈顶时,有所区别。此时,配置成singleTop的Activity,不再会构造新的实例加入到Task栈中,而是将新来的Intent发送到栈顶Activity中,栈顶的Activity可以通过重载onNewIntent来处理新的Intent(当然,也可以无视...)。这个模式,降低了位于栈顶时的一些重复开销,更避免了一些奇异的行为(想象一下,如果在栈顶连续几个都是同样的Activity,再一级级退出的时候,这是怎么样的用户体验...),很适合一些会有更新的列表Activity展示。一个活生生的实例是,在Android默认提供的应用中,浏览器(Browser)的书签Activity(BrowserBookmarkPage),就用的是singleTop。
    
    singleTask,和singleInstance,则都采取的另辟Task的蹊径。
    标志为singleTask的Activity,最多仅有一个实例存在,并且,位于以它为根的Task中。所有对该Activity的请求,都会跳到该Activity的Task中展开进行。singleTask,很象概念中的单件模式,所有的修改都是基于一个实例,这通常用在构造成本很大,但切换成本较小的Activity中。最典型的例子,还是浏览器应用的主Activity(名为Browser...),它是展示当前tab,当前页面内容的窗口。它的构造成本大,但页面的切换还是较快的,于singleTask相配,还是挺天作之合的。
    
    singleInstance显得更为极端一些。在大部分时候singleInstance与singleTask完全一致,唯一的不同在于,singleInstance的Activity,是它所在栈中仅有的一个Activity,如果涉及到的其他Activity,都移交到其他Task中进行。这使得singleInstance的Activity,像一座孤岛,彻底的黑盒,它不关注请求来自何方,也不计较后续由谁执行。在Android默认的各个应用中,很少有这样的Activity,在我个人的工程实践中,曾尝试在有道词典的快速取词Activity中采用过,
    是因为我觉得快速取词入口足够方便(从notification中点选进入),并且会在各个场合使用,应该做得完全独立。
    
    大的apk 拆成 很多小的apk  
      ●Activity的android:affinity属性
    1.配置后 当启动这个activity时就先去找有没有activity的亲和力属性相同 有就加入这个
        activity所在的任务中没有就新开任务(照相和图库就是有亲缘关系的,在照相里面可以点击进去图库。)
    2.affinity起作用需要的条件二者具备一个:
            1.intent包含FLAG_ACTIVITY_NEW_TASK标记
            2.activity元素启用了allowTaskReparenting属性.
    
    43. 在Android中,怎么节省内存的使用,怎么主动回收内存?
      回收已经使用的资源,置为null.  
      合理的使用缓存
    合理设置变量的作用范围…  application 对象 
    //未来的某一段时间执行  
    System.gc();
    
    44. 不同工程中的方法是否可以相互调用?
      可以,列举aidl访问远程服务的例子.
    
    
    45. 在Android中是如何实现判断区分电话的状态,去电,来电、未接来电?
    Day8 showAddressService.java
    46. dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
    Dvm的进程是dalivk虚拟机进程运行在linux里面,每个android程序都会开启一个Dvm的进程,都运行在自己的进程里面,
    每个android程序系统都会给他分配一个单独的liunx  uid(user id), 
    每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.
    
    47. sim卡的EF 文件有何作用
      Sim卡相关的东西,没接触过,sim的存储空间。 
    48. 如何判断是否有SD卡?
      配置文件中有sd卡的权限, 通过environment的静态方法,
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    49. 嵌入式操作系统内存管理有哪几种, 各有何特性。
    页式,段式,段页,等 … 
    
    50. 什么是嵌入式(对CPU和内存要求比较低,单片机就是嵌入式操作系统)实时操作系统, Android 操作系统属于实时操作系统吗?
    实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。 
    
    51. 一条最长的短信息约占多少byte? 
    中文70(包括标点),英文160,160个字节 这个说法不准确,
    要跟手机制式运营商等信息有关. 
    
    做实验,看源码
    ArrayList<String> msgs = sms.divideMessage(message); 
             for (String msg : msgs) {  
                sms.sendTextMessage(phoneNumber, null, msg, pi, null);       
    }
  • 相关阅读:
    C#如何用OpenFileDialog控件打开图片显示到PictureBox这个控件
    C# winform 禁止窗体移动
    linux 硬链接和软链接(转)
    linux 源码编译(转)
    linux 压缩与解压缩
    硬盘分区(来自百度百科)
    arp:地址解析协议(Address Resolution Protocol)(来自维基百科)
    c++学习笔记(1)
    ProbS CF matlab源代码(二分系统)(原创作品,转载注明出处,谢谢!)
    [eclipse]UML之AmaterasUML 插件
  • 原文地址:https://www.cnblogs.com/yaowen/p/5170778.html
Copyright © 2011-2022 走看看