你所不知道的Activity

1.生命周期

关于生命周期,详细讲解下:

activity_lifecycle.png

上图是从android官网获取的生命周期。
正常的流程,很多文章都讨论过了,我们讨论几个特殊的情况。
1)OnResume->OnPause->OnResume 我们看这段解释:The activity is no longer visible。
也就是说在onpause阶段,activity还是可见的,but,它不在最上面,这种情况一般情况下,就是在activity页面弹一个dialog。
测试:亲测,android5.1 onpause不会走到。
还有一种说法是,有一个半透明的activity覆盖了activityA,activityA就会走到onPause,但不会onStop。
在android 5.1 上,还是会走到onStop。
我自己发现了一种可以的case:
ActivityA->ActivityB, ActivityB 的theme是@android:style/Theme.Dialog
这个时候ActivityA是onPause,but不会进入onStop。
2)App process killed
If an activity is paused or stopped, the system can drop the activity from memory by either asking it to finish,or simply killing its process. When it is displayed again to the user, it must be completely restarted and restored to its previous state.

上面代码解释了,当app处于onpause/onStop状态时,如果系统内存不足,该activity就会被回收,恢复的时候将需要从onCreate从新开始走。
protected void onCreate(@Nullable Bundle savedInstanceState)

所以说判断activity是否是首次创建,通过Bundle参数是否为null可以来判断。
当然,activity的内容已被回收,需要考虑如何恢复场景。
这里暂时先保留一个疑问:这个savedInstanceState是存在哪里的,为什么可以被重现?
关于onSavedInstanceState的说明:
这个方法不属于生命周期的概念,所以它与OnPause没有先后之分,并且它并不一定会被调用。
而该函数的目的,是为了在activity被回收的时候,有一个保存状态的地方。
如果app没有被回收,onRestoreInstanceState & onCreate也不会从新被走到。
这里会有个问题,这2个方法的bundle参数是一样的吗?
是的,它们是一份内容。onRestoreInstanceState 只是在onCreate的时机不是特别好做状态还原的时候,提供一次机会,在初始化结束的时候
回复状态。
onRestoreInstanceState 只有在activity重新init的时候,才会被调到。
This method is called between {@link #onStart} and * {@link #onPostCreate}.

onPostCreate是Activity创建过程的最后一步,一般app不需要重载该方法。
另:系统会自动保存view的状态在savedInstanceState的时候。
关于saveInstanceState也是在mainthread里面执行回调的。
3)onDestory回收资源
在onDestory回收资源不一定是比较好的办法。应为onDestory可能不会被走到。一个可行的方式是自己管理资源的回收,而不依赖与生命周期。

2.Configuration Changes

配置变化,包括screen方向,语言
such as a change in screen orientation, language, input devices, etc

这些改变,android希望由程序员自己来handler,所以如果没有做任何配置,activity会被重新创建。
fulmath.samples I/MainActivity: onDestroy: com.joyfulmath.samples.MainActivity@c4f7c4d [at (MainActivity.java:74)]10-09 06:39:35.951 3889-3889/com.joyfulmath.samples I/MainActivity: onCreate: com.joyfulmath.samples.MainActivity@28808a14 [at (MainActivity.java:27)]10-09 06:39:35.951 3889-3889/com.joyfulmath.samples I/MainActivity: onCreate: 2 [at (MainActivity.java:31)]

但是saveInstanceState会被保存下来,这从另一个方面证明,这个bundle不是存在activity里面的。
亲测:language和screen orientation的改变,都会创建新的activity实例。
关于这块的详细说明android官方文档有解释:
https://developer.android.com/guide/topics/manifest/activity-element.html#config
我就不在复述了。
关于语言的监听需要从local + layoutdirection来同时设置。android:configChanges
从实际使用场景来说,屏幕方向的改变是最有可能会遇到的。orientation+screenSize需要配置在manifest中。

3.permission

关于APK之间的activity相互调用,一共有三种方式:具体可参考http://www.cnblogs.com/winxiang/archive/2012/05/04/2482883.html
但是第一种方式是无法阻止的。就像service & contentprovider一样,可以使用permission来控制访问权限。
我们可以自定义permission,并且由activity使用。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.joyfulmath.samples">    <permission        android:name="com.joyfulmath.samples.permission.ACCESS"        android:label="Samples  custome permission"        android:protectionLevel="dangerous" >    </permission>    <application        android:name=".MyApplication"        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity"            android:configChanges="orientation|screenSize|locale|keyboardHidden|layoutDirection">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name=".basecontrol.ActivitySamples_"            android:permission="com.joyfulmath.samples.permission.ACCESS"            >            <intent-filter>                <action android:name="find.samples"></action>                <category android:name="android.intent.category.DEFAULT"></category>            </intent-filter>        </activity>    </application>    <!--android:theme="@android:style/Theme.Dialog"--></manifest>

上面是一个简单的permission的使用。
permission的目的是为了阻止其他apk对该activity的任意访问,所以同一个apk内,就没有这个概念。包括explored属性是一样的。

4.Process Lifecycle

系统会尽可能的保存process的存活,但是如果一定要回收process的话,会有一个优先级来管理。
前台进程
进程持有一个与用户交互的activity
进程持有一个service,该service同某个用户交互的activity绑定。该service是setforeground。该service正在进行生命周期回调。
进程持有一个boradcast,该broadcast在进行onreceiver。
kill前台进程需要用户交互。
可见进程
进程持有一个可见,但不在前台的activity,进入onpause,but没有进入onstop。
进程持有一个可见service,该service和可见activity在交互。
服务进程
进程持有一个不属于上面2种情况的service,也就是startservice的情况。
后台进程
后台进程通常就是不属于上面3种情况下,对应activity就是在onstop状态。
通常会有很多后台进程在运行,系统会有一个LRU表来管理,而最远的process将会优先被kill掉。
空进程
只是系统缓存,目的为了加快进程组件的加载。

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

推荐阅读更多精彩内容