Activity

2019-02-01  本文已影响10人  谷哥得小弟

Q:说下Activity的生命周期?
onCreate() 初始化界面相关布局、资源等操作
onStart() 界面可见,但不可交互
onResume() 界面可见,且可进行交互
onPause() 界面挂起,可以进行数据储存、关闭动画等操作
onStop() 停止当前界面,可以做一些资源回收操作,关闭网络连接、广播等
onDestory()销毁界面,销毁相应得资源
界面从后台回到前台,执行onRestart()操作,然后执行onStart(),onResume()

Q:onStart()和onResume()/onPause()和onStop()的区别?
他们是activity或者fragment的不同生命周期方法,onStart()是界面已初始化完成,展示给用户,但用户还不能交互等到下一个周期onResume()之onPause()是应用的最前面一个界面,用户可以进行操作,当onPause()挂起后,用户可以马上回来,这时会执行onResume()恢复之前的页面,当然如果到了onStop()停止了当前界面之后想回来的话就要先执行onReStart()方法然后再循环执行onStart()和onResume()

Q:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个对话框activity呢?
会回调onPause()和onStop();如果Activity B是完全透明则只回调onPause() ;如果启动的是一个对话框activity则同后者

Q:谈谈onSaveInstanceState()方法?何时会调用?
当activity有可能被系统收回时,在onStop()方法前,此方法默认实现会帮我们保存当前界面的状态信息,我们可以使用onRestoreInstanceState()或者在oncreate()中取bundle数据。何时调用:
1、当我们按下home键
2、从最近应用中选择其他应用
3、按下电源键关闭屏幕时
4、启动一个新的activity时
5、切换屏幕方向时

Q:onSaveInstanceState()与onPause()的区别?
onSaveInstanceState()不一定会被触发,只在发生异常保存数据,当页面重建时不至于所有数据都丢失,适合保存一些非持久性数据;而在一个完整生命周期内onPause()肯定会被触发,会挂起当前页面,不管页面会不会被销毁,所以这里适合保存一些持久性数据。

Q:如何避免配置改变时Activity重建?
使用强制横屏或者竖屏模式,在注册activity的manifest 文件 注册activity的地方android:screenOrientation="portrait"

Q:优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?
先在onSaveInstanceState()方法中对需要保存的数据进行保存,再在onRestoreInstanceState()或者在onCreate()中取bundle数据,onCreate()中取数据记得非空判断

Q:说下Activity的四种启动模式?(有时会出个实际问题来分析返回栈中Activity的情况)
standard 标准模式,不写默认这个,不管栈中没有当前页面都重新创建新的页面;
singleTop 栈顶模式, 栈顶不重复,可以防止重复点击相同按钮打开两个相同页面;
singleTask 单例模式,堆栈不重复,栈内始终只有当前一个页面;
singleInstance 开新栈,添加一个页面就要开一个新栈;

Q:谈谈singleTop和singleTask的区别以及应用场景
singleTop栈顶单例,适合大部分普通情况页面;而singleTask整个堆栈单例,当打开页面时会把上面的所有界面都清空,适合主页和登陆页这种用户开始的页面,或者需要获取token权限的页面

Q:onNewIntent()调用时机?
当打开一个页面,这个页面存在并正在运行时就会执行onNewIntent()方法接收数据。

Q:了解哪些Activity启动模式的标记位?

Q:如何启动其他应用的Activity?
隐式启动:选择好我们需要访问的Action,以及URI,通过intent启动,在被启动的应用页面注册的 <intent-filter>中设置相应的隐式启动权限,包括action,category ,data。 如果是在浏览器中通过网页打开应用的话category还得支持浏览器android.intent.category.BROWSABLE

Q:Activity的启动过程?
1、应用通过startActivity或是startActivityForResult方法向ActivityManagerService发出启动请求。
2、ActivityManagerService接收到启动请求后会进行必要的初始化以及状态的刷新,然后解析Activity的启动模式,为启动Activity做一系列的准备工作。
3、做完上述准备工作后,会去判断栈顶是否为空,如果不为空即当前有Activity显示在前台,则会先进行栈顶Activity的onPause流程退出。
4、栈顶Activity执行完onPause流程退出后开始启动Activity。如果Activity被启动过则直接执行onRestart->onStart->onResume过程直接启动Activity(热启动过程)。否则执行Activity所在应用的冷启动过程。
5、冷启动过程首先会通过Zygote进程fork出一个新的进程,然后根据传递的”android.app.ActivityThread”字符串,反射出该对象并执行ActivityThread的main方法进行主线程的初始化。
6、Activity所在应用的进程和主线程完成初始化之后开始启动Activity,首先对Activity的ComponentName、ContextImpl、Activity以及Application对象进行了初始化并相互关联,然后设置Activity主题,最后执行onCreate->onStart->onResume方法完成Activity的启动。
7、上述流程都执行完毕后,会去执行栈顶Activity的onStop过程。

上一篇下一篇

猜你喜欢

热点阅读