Android开发艺术笔记-第一章

1.onRestart: 从不可见状态变成可见状态。 一般是用户重新切换回Activity发生的动作

2.onStart:已经是可以见状态,但位于后台,还未可以进行交互

3.onResume:已经可以见状态,位于前台,可以交互   

4.onPause:表示正在停止。可以在此做一些轻量级的操作,不能太耗时的。 如 存储数据、停止动画等等。这里有个特殊情况,当用户将当前Activity切换到后台之后,若快速切换回来,则直接调用onResume()方法。

5.onStop:表示即将停止,可以做一些重量级的操作,但依旧不能太过耗时。 (这里玉刚前辈并没有做出例子的举例,不太理解。

6.onDestory:最后一个生命周期回调,做一些最终的工作。

7.特殊情况:如果新的Activity采用的是透明主题,那当前Activity不会回调onStop。 比如B是透明主题,则从A启动B,A不会执行onStop

8.onStart()和onStop()、onPause()和onResume()这两对方法的区别:
a.从角度分析,前者是由是否可见(后台、不可交互)来分析,后者是由是否位于前台的角度来分析(前台,可交互)。
b.这两者除了这个区别之外 在实际使用中没有明显的区别。
c.值得注意的是 当由A启动B的时候 执行的顺序是A~onPause->B~onCreate()->B~onStart()->B~onResume()->A~onStop()
所以由以上例子可分析得出,我们应该在onStop()进行保存数据,停止动画等等,这样可以让B尽快出现在前台可交互状态。

9.系统配置发生改变后Activity的变化分析。 
        a.当配置发生改变,如屏幕旋转等,原来的Activity会被销毁(并且正常执行onPause()、onStop()、onDestory()方法),并且会创建一个新的Activity实例
        b.在这种情况下,能够获取保存数据的两个途径。旧的实例会额外调用onSaveInstanceState方法来保存原来Activity的状态,并将参数传递给新的Activity实例中onCreate()中的Bundle参数,以及onRestoreInstanceState方法中的参数。不同的是onCreate中的参数可能为空,很容易理解,当没有意外结束时这个参数当然为空,但如果调用了onRestoreInstanceState()方法,则旧实例肯定调用了onSaveInstanceState()方法。
        c.系统也会帮助我们做一些保存工作:如文本框中用户输入的数据、ListView的滚动位置等等,这些View相关的状态系统都能默认帮助我们保存。
        d.View和Activity一样,也有相应的onSaveInstanceState()和onRestoreInstanceState()方法。如TextView 可以帮助我们保存文本选中状态和文本内容。
        e.这种情况的具体流程是,Activity委托Window,Window委托顶级容器(ViewGroup)保存,最后顶层容器再意义通知子元素去保存数据。
           这是一中典型的委托思想。 View的绘制过程、事件分发都是采用类似的思想。

10.系统资源不足导致优先级低的Activity被杀死
        a.前台Activity--正在和用户交互的Activity,优先级最高。
        b.可见但非前台的Activity--比如Activity弹出一个对话框,导致Activity可见,但是位于后台无法直接和用户交互
        c.后台Activity--已经执行了onStop()的Activity,优先级最低。如果一个进程没有四大组件在运行,也会很快被杀死。所以后台任务不应该脱离四大组件,一般使用Service保证一定的优先级,这样就不会轻易得被系统杀死。

11.当系统配置发生改变,使Activity不重新创建的方法-->在AndroidMainfest.xml中的方法android:configChanges="orientation".
      a.主要三个属性 1.locale(本地语言发生改变) 2.orientation(屏幕旋转)3.keyboardHidden(软键盘的呼出和隐藏)
      b.需要注意的两个属性screenSize和smallestScreenSize,他们的行为和SDK有关。 一般设置了orientation都要加上screenSize来确定有效。
      c.screenSize 当屏幕尺寸信息发生改变,当屏幕旋转时,屏幕尺寸会发生变化,这个选项比较特殊,它和编译选项有关,当编译选项中的minSDKVersion和targetSDKVerison低于13时这个选项不会导致Activity重启,否则会导致Activity重启(API 13添加)
      d.smallestScreenSize 设备的物理屏幕尺寸发生改变,这个项目和屏幕旋转方向没有关系,仅仅表示在实际的物理屏幕的尺寸发生改变的时候发生,比如用户切换到了外部的显示设备,这个选项和screenSize一样,当编译选项中的minSDKVersion和targetSDKVerison低于13时,这个选项不会导致Activity重启,否则会导致Activity重启(API 13添加)
      e.调用的是Activity的onConfigurationChanged方法。这里可以做自己的一些特殊处理。

12.Activity启动模式
       a.standard:标准模式。无论是否存在,都创建新的实例,并放入Activity栈中。需要注意的是,如果我们使用this.getApplicationContext()这个context去启动一个新的Acitivity会有如下错误AndroidRuntime: Calling startActivity from outside of Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?意思是这里是用非Activity的Context去启动,并没有所谓的Activity栈。解决这个问题的方法是 指定FLAG_ACTIVITY_NEW_TASK的标记为,这样就会为他创建一个新的任务栈,这个时候启动的Activity实际上是以singleTask的模式启动的
       b.singleTop:栈顶复用模式。如果新的Activity已经位于栈顶,那么此Activity不会再次重新创建,同时它的onNewIntent()方法会被调用,通过此方法的参数可以拿到当前请求的信息。注意这个Activity的onCreate()、onStart()不会被调用。调用过程是onPause()->onNewIntent()->onResume()。
       c.singleTask:栈内复用模式。这是一种单例模式。只要在Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例。和singleTop一样,系统调用onNewIntent()方法。注意两点:1.如果ABC C在栈顶,C启动A,这样的话BC都会被移出栈。2.栈1:ABC 栈2:DE 如果E请求启动C则 栈2:ABCDE ;如果E请求栈D则 栈2:ABCD
       d.singleInstance:加强单实例模式。加强的singleTask模式。单独存在一个任务栈中。

13.Activity栈知识相关:
       a.一般情况下,应用内所有的Activity都存在以应用包名命名的一个任务栈中。
       b.可以手动为Activity指定栈,在AndroidMainfest.xml中,<activity android:taskAffinity="com.fyg.task"/> 
       c.书本中提及了一个例子,但不知道有何实际作用。先做记录,应用A启动应用B中的一个Activity C,再按HOME回到桌面,单击B的桌面图标。这个时候并不是启动B的主Activity,而是重新加载已经被应用A启动的Activity C,这个C只能运行在A的任务栈中,但是C属于B应用,正常情况下,它的TaskAffinity的值肯定不一样,因为包名不同。所以当B被启动之后,B会创建自己的任务栈,这个时候系统发现C原本所想要的任务炸你已经被创建,所以就把C从A的任务栈中转移过来了。

14.Activity的Flags(标记位有很多,以下就列举几个。对于标记位 理解即可,一般是系统内部使用,应用程序不需要手动设置这些标记位。)
a.FLAG_ACTIVITY_NEW_TASK:指定“singleTask”启动模式,和XML一样
b.FLAG_ACTIVITY_SINGLE_TOP:指定“singleTop”启动模式,和XML一样
c.FLAG_ACTIVITY_CLEAR_TOP:具有次标记位的Activity,当它启动时,在同一个任务栈位于它上面的Activity全部出栈。一般和singleTask启动模式一起出现。
d.FLAG_ACTIVITY_EXXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在列表中,当某些情况下我们不希望用户通过历史列表回到时候用。等同于XML中android:excludeFromRecents="true"不明白有啥用? 

15.IntentFilter过滤列表
a.一个Activity可以有多个过滤列表
b.需要同时匹配action、category、data信息,否则匹配失败
c.一个过滤列表的action、category和data可以有多个
e.action的匹配: 要求Intent中必须存在和过滤列表中其中一个action相同(区分大小写)。
f.category的匹配:Intent可以不带,但一旦有category,而且不管有几个,都要与列表定义的相同,否则失败。因为startActivity或startActivityForResult,系统都会默认带上这个。若我们采用隐式调用,则需要在XML指定android.intent.category.DEFAULT。
g.data的匹配:和action类似。data内容比较多,可以参考书上30-34页。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值