Activity

作者: 谷哥得小弟 | 来源:发表于2019-02-01 18: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启动模式的标记位?

    • FLAG_ACTIVITY_NEW_TASK 在一个新的task中开启一个activity。如果包含该activity的task已经运行,该task就回到前台,activity通过onNewIntent()接受处理该intent。
      这是与"singleTask"登录模式相同的行为。
    • FLAG_ACTIVITY_SINGLE_TOP 果要被开启的activity是当前的activity(在返回栈的顶部),已经存在的实例通过onNewIntent()接收一个调用,然后处理该intent,而非重新创建一个新的实例。
      这与"singleTop"登录模式有相同的行为。
    • FLAG_ACTIVITY_CLEAR_TOP 如果要被开启的activity已经在当前的task中运行,系统不会生成该activity的一个新的实例,在该栈顶部的所有其他的activity会被销毁,这个intent通过 onNewIntent()被传递给该重新运行的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过程。

    相关文章

      网友评论

          本文标题:Activity

          本文链接:https://www.haomeiwen.com/subject/xwarsqtx.html