Activity

1.生命周期

第一次启动:
onCreate->onStart->onResume
跳转其他页面:
onPause->onStop
回到页面:
onRestart->onStart->onResume
结束当前页面:
onPause->onStop->onDestroy

异常情况下的生命周期分析

onSaveInstanceState 与 onRestoreInstanceState(TextView 等都有这个方法)
对于 onSaveInstanceState 的调用说明:

Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key)
从这句话可以知道,当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行(按 home 旋转屏幕等等),除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。

对于onRestoreInstanceState什么时候被调用

onRestoreInstanceState()被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行 此也说明上二者,大多数情况下不成对被使用。

  • 我们可以通过 onRestoreInstanceState 和 onCreate 方法来判断Activity是否被重建了,
  • 可以通过android:configChanges="orientation|screenSize"...来阻止Activity重新创建。

问题1:
当前页面是 Activity A ,如果用户打开一个新的 Activity B, 那么 B 的 onResume 和 A 的 onPause 那个先执行?

A->onPause
B->onCreate
B->onStart
B->onResume
A->onSaveInstanceState
A->onStop


2.任务栈

Task是为了完成某个工作的一组相关联的Activity的集合
为了方便大家更直观感受一下,可以使用adb命令查看一下当前运行的Task:

adb shell dumpsys activity activities

注意其中的几个关键字

Stack
TaskRecord
ActivityRecord

用图形来表示他们之间的关系


"Hist"代表Task中的ActivityRecord,可以理解成对应某个实际的Activity。
"Stack #0"表示mHomeStack(ActivityStack类),保存了Launcher相关的Activity的Task。
"Stack #1"表示mFocusStack(ActivityStack类),用于保存Launcher除外的其他应用的Activity组成的Task。

这两个Stack由ActivityStackSupervisor负责组织管理,在Android 4.4之前的版本是没有ActivityStackSupervisor这个类的,也没有"Stack #"的划分,AMS直接管理Task的列表。

TaskRecord{4226f148 #60 A=com.ryg.chapter_1 U=0 sz=5}       
Run #5: ActivityRecord{41a7e988 u0 com.ryg.chapter_1/.MainActivity t60}
Run #4: ActivityRecord{41a68f40 u0 com.ryg.chapter_1/.MainActivity t60}
Run #3: ActivityRecord{418d32f8 u0 com.ryg.chapter_1/.MainActivity t60}
Run #2: ActivityRecord{4212a450 u0 com.ryg.chapter_1/.MainActivity t60}
Run #1: ActivityRecord{4226ee78 u0 com.ryg.chapter_1/.MainActivity t60}

其中 com.ryg.chapter_1 代表 taskAffinity 值,我们也可以为一个Activity指定任务栈,如下:
TaskAffinity 标识了一个 Activity 所需要的任务栈。默认情况下,所有 Activity 所需的任务栈的名字为当前应用的包名。

<activity
    android:name="com.ryg.chapter_1.MainActivity"
    android:configChanges="orientation|screenSize"
    android:launchMode="singleTask"
    android:taskAffinity = "com.jack.org1"></activity>

3.启动模式

  • standard:
    标准启动,Activity每次都会 onCreate
  • singleTop:
    如果置于栈顶 onNewIntent(),如果栈中不存在这个Activity,onCreate会调用。反之则 onNewIntent();
  • singleTask:
    检测整个 Activity 栈是否有当前需要启动的 Activity,自带 clear 属性。特殊情况:其他程序以 singleTask 启动创建一个新的任务栈。 如果栈中不存在这个Activity,onCreate会调用。反之则 onNewIntent();
  • singleInstance:
    单实例模式,除了拥有singleTask的属性外,还加强了一点,就是这种模式的Activity只能单独位于一个任务栈中。

指定启动模式

  • <manifest> 中指定。
  • Intent 中为 Activity 设置标记位,优先级高些。
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Flags 常见的标记位

1.FLAG_ACTIVITY_NEW_TASK
当Intent对象包含FLAG_ACTIVITY_NEW_TASK标记时,系统在查代时(和设置了singleTask启动模式一样都是)按Activity的taskAffinity属性进行匹配,如果找到一个Task的taskAffinity与之相同,就将目标Activity压入此Task栈中,如果找不到则创建一个新的Task。
2.FLAG_ACTIVITY_SINGLE_TOP
3.FLAG_ACTIVITY_CLEAR_TOP
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
不希望用户通过历史列表回到我们的 Activity 的时候,这个标记位比较有用。

4.startActivityForResult

注意点:要保证 要启动的 activity 的启动模式是 standard, A 启动 B.
一般这样封装比较好,如下:

  1. 在 B 中,设置一个方法,供 A 去启动 B
public static void startChoosePayActivity(Activity activity, int guaranteeFee, int requestCose) {
    Intent intent = new Intent(activity, ChoosePayActivity.class);
    intent.putExtra("guaranteeFee", guaranteeFee);
    if (requestCose == -1) {
        activity.startActivity(intent);
    } else {
        activity.startActivityForResult(intent, requestCose);
    }
}
  1. 在 B 中传递数据给 A。
setResult(RESULT_OK, getIntent().putExtra("paytype", result));
finish();
  1. 在 A 的 onActivityResult 取出值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode != RESULT_OK) {
        return;
    }

    switch (requestCode) {
        case IntentContent.PAYTYPE_SELECT_REQUEST:
            int nPaytype = data.getIntExtra("paytype", -1);
            E_PAY_TYPE e_pay_type = E_PAY_TYPE.valueOf(nPaytype);
            switch (e_pay_type) {
                case PAY_ALIPAY:
                    LogUtils.i(TAG, "支付宝支付");
                    break;
                case PAY_WECHAT:
                    LogUtils.i(TAG, "微信支付");
                    break;
                case PAY_WALLET:
                    LogUtils.i(TAG, "钱包支付");
            }
            break;
    }
}

参考资料

相关链接

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

推荐阅读更多精彩内容