Activity详解

Activity生命周期   
onCreate->onStart->onResume->onPause->onStop->onDesory
两个Activity切换
Actvity1         Activty2
onCreate          
onStart
onResume
开启第二个Actvity
onPause       问题:1这边为什么要设计成先回调Activity1的onPasuse
                        onCreate
                    onStart
                    onResume
onStop           问题:2这边为什么设计成Actvity2显示获取焦点后再回调Activity1的onStop
关闭Actvity2
                        onPasue     
onRestart
onResume
                    onStop
                    onDestroy
生命周期交互设计思想
问题1:为了我们在开启Activity2时先对Actvitiy1中一些必要的资源进行回收;例如音乐或视频软件在播放时,一个电话过来(电话界面Activity2)显示,如果我们没有之前的onPause控制就会在电话界面听到媒体声
问题2:不随着onPause(快要不可见)调完直接onStop(不可见),是万一Activity2出现意外,没有成功开启(crash),会直接出现黑屏
横竖屏生命周期
横竖屏切换的时候,默认不做配置的时候,当前Activity是会销毁在创建的(生命周期也是如此)
int ORIENTATION_PORTRAIT = 1; 竖屏
int ORIENTATION_LANDSCAPE = 2; 横屏
setRequestedOrientation();//代码中手动动态设置Actvity的横竖屏
getResources().getConfiguration().orientation;获取当前横竖屏状态
xml中Activity configChanges的配置:;
1. orientation 屏幕在纵向和横向间旋转
2.keyboardHidden 键盘显示或隐藏
3.screenSize 屏幕大小改变了
4.fontScale 用户变更了首选的字体大小
5.locale 用户选择了不同的语言设定
6.keyboard 键盘类型变更,例如手机从12键盘切换到全键盘
7.touchscreen或navigation 键盘或导航方式变化,一般不会发生这样的事件
一般只会用到前三个
配置如下,Activity生命周期不会回调
android:configChanges="orientation|keyboardHidden|screenSize"
配置了orientation之后
onConfigurationChange()就可以收到横竖屏切换回调(不配置是收不到回调的)
启动方式
系统常见的Activity
Activity中的任务栈
  • task与backStack
1. 启动一个app,framework都会为这个app分配一个Task,有对应的TaskID和stack,然后在这个APP中所有的activity都共用一个TaskID和stack。
2. 当从一个app的进程跳转到另一个app进程时,还是在同一个task中,这就是Task允许跨进程间调用。 通过在manifest中声明activity "android:process=XXX"可以指定这个activity为另一个进程
3. Back Stack 一个Task就是一系列的activity的集合,这些activity以打开的顺序放入一个stack中,最后打开的activity最先出来。对于一个app来说,main activity就在栈顶的位置。 在一个app中可能会调用其他app的activity,但即使两个activity不在同一个APP中,但是其TaskID是同一个,属于同一个Task Stack file:///D:/software/Eclipse/adt-bundle-windows-x86-20140702/adt-bundle-windows-x86-20140702/sdk/android_sdk_docs_offline_20/docs/guide/components/tasks-and-back-stack.html
4. android中的多任务 假设启动了APP1,对应创建了一个Task A,它有三个activity。然后回到home screen,启动APP2,对应创建了一个Task B。此时,Task A的activity虽然全部stop了,但是Task A的stack还是完整存在的。然后可以通过回到home screen或点击recent apps启动Task A,它的activity回到前台。
  • 查看Activity任务栈的命令
    adb shell dumpsys activity
    (1)running activities部分可以查看当前正在运行的activity
    (2)mFocusedActivity可以查看正在获取焦点的activity
    (3)Recent tasks可以查看最近的一些任务
启动模式
    standed
    singleTop 栈顶复用模式
    singleTask 栈内复用模式
    singleInstance 整个Android系统内存中有且只有一个实例,而且该实例单独一个task,即是栈底也是栈顶
    问题:
1 在SingleInstance启动模式之下的Task是不是永远只有一个Activity在Task里面,如何在特定的Task里面添加新的Activity?
正如你前半句所说,singleInstance的启动模式下该task有且仅有一个act实例。至于你后半句的疑问,taskAffinity可能对你有帮助。顺便在这说一个官方的错误,就是对于"singleTask"的解释,官方说会创建一个新的task。这样的说法是不严谨的,这里要提到taskAffinity这样一个属性,我们在配置Activity的时候大部分情况下都没有指明taskAffinity,这个值默认是包名,就算是配置成singleTask,其实也不会去创建一个新的task,这边视频中实验也可以发现;singleTask什么时候才会新建一个task呢?就是taskAffinity属性与当前值不一样的时候,且task还不存在时候。这里只是简单说下,具体可以看这篇介绍:解开Android应用程序组件Activity的"singleTask"之谜
2 startActivityForResult和启动模式
startActivityForResult方法能够起效:standard和singleTop
startActivityForResult方法不能够起效:singleTask和singleInstance
1)只要将被启动的Activity属性设置为singleTask则一定不起效
2)只要将被启动的Activity属性设置为singleInstance则一定不起效
3)只要将启动的Activity模式设置为singleInstance则不论被启动的Activity为什么模式均不起效

Activity相关FrameWork分析

    


    




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值