Comments

Android 四大组件中,Activty 最为常见。这里对Activity 的相关知识进行梳理,以供日后查阅。

生命周期

生命周期

  • 六种状态构成了生命周期金字塔
  • 位于顶端的Resumed 状态有着与用户交互的特权
  • 金字塔的第二层对于用户来说可视或部分可视
  • 金字塔的第三层虽然存在于系统内存,但对于用户来说不可视
  • 从箭头的指向来看,Resumed 与Paused 之间的转换最为活跃,为了保证UI流畅,这里应尽可能的放一些轻巧的代码
  • 从Activity 对象的角度来讲,只有三种状态持续存在:Resumed,Paused,Stopped
  • Activity 的Paused 状态对于自身而言是被前台的Activity(或窗口)遮挡了一部分,对于用户来讲这个Activity 只有部分可见。在这种状态下,Activity 对象依然停留在内存里,也同时被windows manager 引用着;Activity 的Stopped状态与Paused 状态类似,除了更彻底的不可见之外,此时此刻这个Activity已经不被windows manager 引用了
  • 当Activity 的Paused 或Stopped状态遭遇系统内存吃紧:系统要么温柔的调用finish() 逐个清理Activity,要么粗暴的结束掉该对象所在的进程

资源管理

  • 鉴于内存吃紧的不可预见,我们应该在onStop()中释放掉那些容易造成内存泄漏的资源
  • 关于onPause()方法更具体的建议
    1.  停止动画等消耗CPU 的操作
    2.  注销广播监听器、传感器监听器等影响电池寿命的资源
    3.  仅当用户需要的情况下,提交未保存的状态。为了保证界面的平滑切换,应避免在这里调用CPU-Intensive 的操作(如,写数据库),而应将其移至之后的stop方法中
    
  • onSaveInstanceState()默认的会保存Activity 的视图结构,如Checkbox 是否被选中,Edittext 中的编辑文字,但前提是为每个控件都配备有一个独特的ID
  • 当且仅当有数据需要恢复的时候,onRestoreInstanceState()才被系统调用,且一般在onStart()之后
  • 可以使用finish()以及finishActivity(int requestCode)来关闭Activity,但除非你确定必须这么做,不然最好将这项工作交由系统来完成
  • 一般情况下,如果一个应用退到后台超过30分钟,系统会清理掉该堆栈中的acitivties。但如果android:alwaysRetainTaskState属性被设置为true,用户重返应用的时候总会获得上次Activity的状态。这一点对于浏览器应用相当有用
  • 如果属性android:noHistory被设置为true,那么当用户从这个activity 离开的时候,就会自动调用finish()。因此,无法从任务堆栈中找回该activity 的历史轨迹了
  • 一般来讲,onDestroy() 的执行应该在onPause()或者onStop()之后。但如果,你在onCreate()中直接调用finish(),则系统会直接跳过他们调用onDestroy()

运行模式

  • Task 是由一组为了完成某项工作的Activities 组成,它们不受进程或应用的约束,体现的是Activity 之间相互调用和执行的关系
  • Activity 的运行模式有四种:standard,singleTop,singleTask,singleInstance。除了Standard 之外的三种模式对于activity均有不同程度的复用
  • standard 与singleTop 类似,在程序运行的过程中,这两种模式的activity 会有多个实例出现在一个或多个Task 中的任意位置。但二者之间有着细微的差别:singleTop 模式下的activty 如果在目标task 的顶部,对于新收到的intent会使用onNewIntent()回调来响应;其他情况下和standard 模式一样,对于每一个新收到的intent 都对应一个新的实例。
  • singleTask 与singleInstance 类似,都只能出现在一个task stack 内,且始终呆在stack 的根部,对于整个设备来说它们只有一个实例。除此之外,它们都使用onNewIntent() 来响应创建后收到的intent。但两者之间有着细微的差别:singleTask 允许引入新的activity 来组建task,而singleInstance 永远自成一派。很显然,singleInstance适合内存消耗较多的界面,如播放器、浏览器等。

其他

  • 如果项目中没有一个Activity 被设置为MAIN action 或者LAUNCHER category,那么桌面就不会显示相应的图标
  • 程序运行过程中,如遇到配置变动,则会引起activity 重启,这是系统自动适配的行为。
  • 重启后,其数据需要得到重新填充。如果数据量较小,则可以依赖onSaveInstanceState()以及onRestoreInstanceState()这两个回调接口;反之,则需要特殊对待:要么规避系统的重启行为,自己来做适配工作;要么在配置变更的时候通过接口onRetainNonConfigurationInstance()来保存数据对象,待到重启之后使用getLastNonConfigurationInstance()来恢复相关数据

参考资料

Comments

这几年,你有没有发现“赞美”变成了一件奢侈的事情?尤其当你面对一群挑剔的听众,你的赞美往往会被人扭曲:“你拿了人家什么好处,这样帮他说话?”、“推销?你被洗脑了吧!”、“这你都没见过?有什么好大惊小怪的。”…诸如此类。不晓得从什么时候开始,开口赞美,也变得越来越有压力了。

赞美的起点似乎总比被赞美的事物要低,反而吐槽更容易让你居高临下,优越感一览无遗。不管人家说什么,你跟着去赞美,容易被人说成是拍马,而吐槽的言行至少不会显得你太低端(哈哈,说这是批判精神)。这种不用思考的“安全反应”,使得越来越多的人,习惯了吐槽。当跟风赞美变成弱智、“五毛”之后,跟风吐槽就显得有节操,有品位了。任何事情,你都可以表现得不屑一顾,“安全的”凌驾于其之上。只是,这种廉价的破烂习惯,让我们的社会关系变得越来越冷漠了。

其实,生活中并不缺乏温情的画面,讲一个刚刚发生的故事。昨天晚上,我习惯性的去了趟沃尔玛。轮到我结账的时候,为了不让后面排队的人等太久,我手忙脚乱的把货品往买来的2个袋子里塞。收银员打断了我的动作,说:你这些速冻食品压在最底下,回家的时候肯定就烂掉了。我愣了一下,结果,她很自然的接手了剩下来的操作。只用了一个袋子,就将所有货品麻利的装了进去,还照顾到了各种货品的运输属性(易碎性、温度、空间等),合理的安排了他们在装袋时的位置。很快的,我缓过神来,没有说话,但竖起了大拇指。

同样是排队结账,吐槽就显得太过廉价了。你永远可以调侃中国人多,甚至责怪超市收银出口太少,但绝大多数的情况下,你都无法避免排队等候。而这种廉价的吐槽行为,只会让自己愤怒,说不定还会影响他人,人与人之间就在消费吐槽时,变得淡了下来。

Comments

早在1年前,这本书我还只看了几页的时候,就很兴奋的将它推荐给朋友。不过很惭愧的是,直到最近两天才真正把这本书看完。合上书本,书中的故事还会时不时的击中我那弱小的心灵,除了感叹作者的神奇之外,还真心觉得应该为自己的拖延做点什么。于是,很自然的想到写点读书笔记吧。

拖延怪圈

  • 现象:每次尝到恶果之后总会告诫自己,也会在每次任务开始之前提醒自己,可是一到真正动手的时候,总会自觉不自觉的把该做的事情撂在一边。
  • 根源:这是一种内心的恐惧—害怕自己的行为不合适、不被他人接受。
  • 解释:人们之所以产生拖延的不良习性,是因为他们害怕。害怕如果自己行动了,而达不到预期的效果。害怕自己不被接受,以致于躲开这个世界,甚至还躲开他们自己。害怕承认一个难以接受的真相:自己明明尽力了,却还是不能如愿…

比起看清真实的自我所带来的脆弱和无地自容,拖延这个借口或许更容易承受。害怕失败的人有一套自己的假设:自我价值感=能力=表现。这个等式强迫你用每一次的表现来衡量自己的价值。每一次拖延,你可能会想:如果我付出所有的努力,而结果还不够好的话,那我无法承受这样的结局。拖延让这一次的表现不再等同于自身的能力,因为其间缺少了完整的努力——自我价值感与自己表现之间的等同关系就难以维持了(潜台词是,如果我尽力的话,我一定能做的更好)。拖延变成了一种依赖性很强的安慰剂:每一次的拖延,都不会逼着自己去面对那些尴尬、难受的场面。让自己慢慢相信潜在的能力是无限的,是要远远大于其表现的。

完美主义也是凶手

为了追求完美,你通常需要做很多“准备工作”,导致事情进展缓慢。 也许,你并没有意识到自己是完美主义者。反而常常会觉得,事情被弄的一团糟,怎么会是完美主义者呢?其实完美主义者可以划分为两大类:适应型和适应不良型。这两种完美主义者都对自己的要求都很高,不同的是,适应型完美主义者通常能够如愿以偿,而适应不良型则在自己的要求和对自己表现的之间存在着一些矛盾:更容易自责,也更容易感到消沉。无疑,追求完美就像追逐地平线一样:你一直往前赶,但你从来都不能真正抵达想要的位置。

对于完美主义者来说,放弃完美主义是一件艰巨的任务,即使他自己清晰的认识到很多追求完美的想法是不现实的。除此之外,他们还很难接受另外一个事实:你现在不是,从来不是,将来也不可能是完美的

(其实,“感觉不适”是拖延的一个绝好理由,只有自己舒舒服服的时候才愿意采取行动——这其实是完美主义的一个翻版。)

对未知的恐惧

你有没有和我一样,凡是喜欢做最坏的打算?对于未知的恐惧,使得我们选择用拖延来掩饰自己的弱点,不让外界知道自己的需要和依赖。以至于每次恐惧都让我们迟迟不肯卖出第一步。这一点不细说,说多了都是泪啊。

对自我掌控感的执着

这一点尤其体现在被人指使去做一些自己不太情愿的事情。下面这两句,很可能在你的脑袋里出现过:“这项任务真是荒谬!”“我干嘛要按照她的意思来做?”

在这样的背景下,拖延很可能成为你的一种心理平衡的工具。它增强了你的自由感,让你自己认为并不是一个“奴隶”。因为此时此刻,你正在按自己的想法在做。(类似的情况,是体验一种报复的快感)

Change We Need!

从上面的分析里我们不能难看到,想要改正拖延这个顽疾,就必须得面对上述的各种恐惧、放弃曾经的各种执着,而随着岁月的积淀,这些早已形成习惯,挥之不去。

所以,与其和他们来硬的,不如首先接受自己的缺陷、伤痛还有伤疤。接下来呢?接下来就得看造化了,老老实实的开始呗。开始时,可能需要将目标分解成现实、具体、可行的小目标,这样的分解是可以递归进行的,直到最细小的任务出现—以至于你可以轻松的迈出第一步了。