不得不说的Activity

本文只是一些个人的总结,如有写的不对的,欢迎各路大神指正.

一、activity的启动方式

启动方式分为显示启动和隐式启动,显示启动就是直接指定要启动的activity,隐式启动的话就是没有指明要启动的activity,只要是符合自己要求的都会被启动。

1、显式启动

        Intent intent=new Intent(this,B_Activity.class);
        startActivity(intent);

显示启动可以设置flags,不同的flags有不用的效果

  • flages的使用
       //常用的flag:
       //清空当前的任务栈中所有activity,然后将目的activity放入栈中,而且只能与FLAG_ACTIVITY_NEW_TASK联合使用
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        //创建一个新的任务栈,然后将目的activity放入新的任务栈中
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //如果任务栈中存在目的activity的实例,将关闭同栈中处于目的activity顶上的其他activity,使目的activity处于栈顶,
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        //将目的activity设置为栈顶复用模式
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        //不使用跳转动画
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

2、隐式启动
在启动activity的时候不明确要启动哪个,需要匹配在manifest文件中activity的intent-fliter,只有action、category和data完全匹配时才能启动。

  • action的理解

action的值为一个字符串,它代表了系统中已经定义的一系列的动作,使用不同的action可以实现不同的效果,比如打电话、发送短信、打开网页等,默认是“DEFAULT”

  • category

category用于指定action被执行的环境,通过addCategory()或者在Manifest文件中设置,默认是“CATEGORY_DEFAULT”

  • data

通常是URI格式定义的操作数据,如: tel:// ,通过setData()设置

  • Extras

主要用于传递目标组件所需额外的数据,通过putExtras()设置。

二、activity的启动模式

1、标准模式(standed)

理解:每次使用intent都会创建一个目的activity的实例。

2、栈顶复用(singlieTop)

理解:启动目的activity时,如果当前任务栈中存在该目的activity,且该activity处于栈顶时不会创建新的activity,否则会创建新的activity,此时效果和标准模式一样。比如栈中从上往下依次存在ABCD四个activity,此时如果使用栈顶复用模式启动A,不会再创建A的实例,继续使用栈顶的A,并会调用A的onNewIntent方法;如果此时启动的B或者C或D,因为B、C、D不处于栈顶,所以会创建他们的新的实例。
和FLAG_ACTIVITY_SINGLE_TOP作用一致

3、栈内复用(singleTask)

理解:启动目的activity时,如果栈内存在目的activity的实例,且处于栈顶,则效果和栈顶复用一样,如果该实例不在栈顶,就会将该目的activity的实例移到栈顶,并且将处于它上方的activity都关闭。比如:栈中从上到下存在ABCD四个activity,使用栈内复用模式启动D时,ABC会被关闭,是D处于栈顶,并且调用D的onNewIntent方法。
和FLAG_ACTIVITY_CLEAR_TOP作用一致

4、singInstance

理解:使用这种模式启动的activity,系统会创建一个新的任务栈,而且栈中只有这一个activity。单栈单例模式。

三、activity的启动过程(源码相关)

在手机桌面点击app图标启动app
其实手机桌面也相当于是一个app程序(Launcher),点击启动图标,会触发item的点击事件,此时Launcher会获取要启动的app的MainActivity信息,然后通过Binder机制与ActivityManagerService进行多次通讯,最终启动activity。

第一步、Launcher通知AMS(ActivityManagerService)启动App的MainActivity
第二步、AMS记录要启动的activity信息,并回复Launcher,需要Launcher处于Pause状态
第三步、Launcher收到消息让自己处于pause状态,然后告知AMS已经处于pause状态,可以启动App的MainActivity了
第四步、AMS没有启动过app的MainACtivity,会创建新的进程,并在新的进程中创建ActivityThread(主线程),并执行main方法
第五步、创建好主线程以后告知AMS,并传入Application进行通讯
第六步、AMS通知App绑定application,并启动App的MainActivity
第七步、启动MainActivity,并创建和关联context,执行onCreate()

四、activity的声明周期

<此处借用网上的一张图片>


声明周期.png

五、activity的状态改变(横竖屏切换)

activity的状态改变一般是指activity的配置发生了改变,比如横竖屏的切换,此时activity会调用onSaveInstanceStae()对当前activity的一些数据进行保存,关闭activity,然后重启activity,调用onCreate()和onRestoreInstanceState()进行数据的恢复。
横竖屏切换:

  • 在manifest文件中设置screenOrientation的值
  <activity android:name=".B_Activity" 
            android:screenOrientation=""
            />

有以下几种值:
"unspecified":默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
"landscape":横屏显示(宽比高要长)
"portrait":竖屏显示(高比宽要长)
"user":用户当前首选的方向
"behind":和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
"sensor":有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
"nosensor":忽略物理感应器,这样就不会随着用户旋转设备而更改了。

  • 通过代码设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

注意:横竖屏在切换的时候会重新启动activity,所以在切换的时候要及时保存已有数据(onSaveInstanceState()),以及恢复数据(onRestoreInstanceState())。

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