Android Activity笔记

概括

  • Android应用没有特定的单一入口,Activity可以作为程序的入口
  • Activity必须在manifest中注册,对应标签为<activity>,唯一必须的属性是<name>,指定activity的类名;十分有用的属性是<intent-filter>,使得该activity可以被隐式地调用

生命周期

Activity生命周期
  • onCreate(Bundle savedInstanceState):
    • 必须实现的回调,在Activity被系统创建出来的时候调用,setContentView()应该写在该回调中
    • 接受的参数是savedInstanceState包含此前被onSaveInstanceState(Bundle outState)保存的bundle,如果这个activity从未出现过,那么该参数为null
    • 如果有lifecycle-aware组件,在onCreate()阶段会受到一个ON_CREATE事件
  • onStart():onCreate()调用结束之后,Activity进入Started状态时调用,之后Activity变得可见,在该回调中可以初始化维护UI的代码
  • onResume():在Activity和用户进行交互之前调用,此时该Activity处于栈的顶端。应用的大部分核心功能在此处实现。
  • onPause():当Activity失去焦点进入Paused状态的时候调用,意味着Activity仍然部分可见,但用户正在离开;
    • 处于Paused状态的Activity仍然可能更新UI
    • 处于Paused状态的Activity可能完全可见,只是失去焦点不能交互,比如多窗口模式下
    • 不要在onPause()回调中进行数据保存或者网络操作,因为onPause()的执行时间很短,可能没有足够的时间完成这些操作
    • onPause()回调中可以执行一些释放UI无关资源的操作节省资源
    • onPause()执行结束之后,下一个回调函数要么是onStop()要么是onResume():取决于Activity进入Paused状态之后发生了什么
    • onPause()执行结束并不意味着Activity离开Paused状态,完全不可见之后才会离开Paused状态
  • onStop():Activity变得不再可见后调用,接下来要么调用onRestart()重新与用户交互,要么调用onDestroy()被完全销毁,可以在onStop()中进行数据保存和网络操作
  • onRestart():当处于Stopped状态的Activity将被restart的时候调用,恢复activity在被stopped时的状态,随后将调用onStart()
  • onDestroy(): 在activity被销毁前调用,释放资源的操作放在这里,activity被销毁有两种情况:
    • 回退或者调用了finish(),这种情况下activity就完全gone了
    • 被系统回收或者配置改变(例如旋转屏幕)导致activity重建,这种情况下,系统会记得Activity的存在,当用户回到这个activity时,会使用之前保留的数据重建这个activity,为了让系统能保留控件的数据,控件必须要有id
  • onSaveInstanceState()
    • 在此函数会对空间数据进行保存,例如EditText的文字,listView的滚动位置
    • 显式调用finish()是不会调用onSaveInstance()函数的
    • 不应该在此回调中进行数据持久化,应该在
  • onRestoreInstance()的调用时机在onStart()之后

Activity跳转过程的生命周期顺序

  • A的onPause()
  • B的onCreate(),onStart(),onResume()
  • A的onStop()

Task与回退栈

  • 定义启动模式
    • 通过manifest定义
    • 通过IntentFlags定义
  • 四大启动模式与intentFlag
    • standard,标准模式,创建一个新的实例压入当前task的栈顶
    • singleTop,FLAG_ACTIVITY_SINGLE_TOP如果目标activity已经在当前task的栈顶,系统会通过调用onNewIntent()直接使用这个activity而不是创建一个新的实例
    • singleTask,FLAG_ACTIVITY_NEW_TASK如果没有存在实例系统会创建一个新的task栈,然后创建新的activity实例压入到新的task栈中;如果有,通过onNewIntent直接调用
    • singleInstance 目标activity所处的task不会再放入其他activity,目标activity将是其中唯一的activity

taskAffinity

  • affinity用来标识一个activity应该属于哪一个task,默认情况下同一个应用的所有app都具有同一个affinity
  • 通过<activity>的<taskAffinity>属性来定义affinity

清空回退栈

  • 如果用户离开了某个task太长时间,系统会清空task里面除了根activity以外的activity,可以通过以下方式更改这种情况:
    • 设置task的根activity的alwaysRetainTaskState为true,task里的activity都会保留
    • 设置task的根activity的clearTaskOnLaunch为true,task里的所有activity包括根activity都会被清空
    • 设置某个activity的finishOnTaskLaunch属性,效果类似于clearTaskOnLaunch,但是作用于某个activity上的,而不是整个task

进程和应用生命周期

  • 前台进程
    • 正在运行一个和用户交互的Activity
    • 正在运行BroadcastReceiver的onReceive()方法
    • 正在运行Service的onCreate()或onStart()或onDestroy()方法
  • 可见进程
    • 正在运行一个可见的Activity
    • 正在运行一个通过startForeground()运行的Service
  • 服务进程
    • 持有一个通过startService()方法运行的Service
  • 缓存进程
    • 系统不再需要的进程
    • 这些进程通过一个伪LRU表保存

Parcelable和Bundle

  • 不是bundle的数据体积不能超过1M,而是Binder的buffer只有1M

Loader

  • Android3.0引入,用于在Activity或者Fragment中异步加载数据
  • 监控其数据源并在内容变化时传递新结果
  • 在某一配置更改后重建加载器时,会自动重新连接上一个加载器的游标
  • 相关概念
    • LoaderManager 与Activity或者Fragment相关联的抽象类,用于管理一个或多个Loader实例
    • LoaderManager.LoaderCallbacks 回调接口,用于与LoaderManager进行交互
    • Loader 加载器的抽象基类,通常使用的实现是CursorLoader
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342