美文网首页
day4 Activity相关

day4 Activity相关

作者: WangGavin | 来源:发表于2017-09-10 22:25 被阅读20次

    什么是Activity?

    与用户交互的接口,提供用户触摸,点击,滑动的界面。Android中的activity全都归属于task管理 。task 是多个 activity 的集合,这些 activity 按照启动顺序排队存入一个栈(即“back stack”)。android默认会为每个App维持一个task来存放该app的所有activity,task的默认name为该app的packagename。

    四种状态?

    • running
      活动状态,也是activity处于栈顶的状态,这时用户触摸屏幕,activity会响应事件
    • paused
      activity失去焦点或者被比如对话框覆盖时的状态,这时activity只是失去焦点,所有的成员变量和状态都还在
    • stopped
      被其它Activity完全覆盖
    • killed
      activity被销毁

    Activity生命周期,常见类型概述

    Activity生命周期

    第一想到的是那副经典的生命周期图,怎么叙述呢。Activity可以理解为一个界面,为了便于界面编程,安卓设计者赋予了Activity生命周期的概念,从产生到消亡,我们开发者可以在生命周期的对应阶段做相应处理,那么怎么做处理呢?就是Activity每到一个生命周期的阶段,就会回调对应的一个方法,比如创建时回调onCreate()。然后我简单介绍下Activity的一个完整的生命周期是怎样的顺序:

    • 首先创建时回调onCreate(),这里可以进行一些初始化操作,比如设置布局资源,然后onStart(),表明Acitivity正在启动,activity已处于可见状态,但是还没有处于前台显示的,就是用户还不能在此Activity进行交互。接着是onResume(),这个调用后会处于前台可见状态,用户可进行交互。
    • 点击Home键回到主界面(Activity不可见),会让activity退居到后台,这时onPause()会被调用,一般情况下,onStop()会在onPause()执行后调用,这时候表明整个Activity被停止或被完全覆盖,因为这个时候activity是不可见得,完全处于后台运行,另外当调用onPause后,如果系统内存吃紧,activity是有可能被回收的。
    • 当我们再次回到原Activity时,onRestart()会调用,表示这个Activity正在重新启动,从桌面回到APP,,onRestart()调用完后会调用onStart(),activity回到可见状态,和前面一样之后调用onResume,activity回到前台可见可交互状态。
    • 退出当前Activity时->onPause() -> onStop() -> onDestroy(),onDestroy会在activity彻底销毁前调用

    anroid 进程优先级

    • 前台:处于前台和用户交互的activity或者和前台进程Activity绑定的Service所处的进程
    • 可见:处于可见,但不处于前台,用户不可以交互的进程
    • 服务:后台开启的Service服务
    • 后台:点击了Home,前台进程变为后天进程

    activity被回收的状态和信息保存和恢复过程

    onSaveInstanceState方法在Activity可能被回收之前调用,用来保存自己的状态和信息,以便回收后重建时恢复数据(在onCreate()或onRestoreInstanceState()中恢复),旋转屏幕重建Activity会调用此方法,而且要调用的话就一定发生在onStop方法之前,但并不保证发生在onPause的前面还是后面。onRestoreInstanceState方法这个方法在onStart 和 onPostCreate之间调用,在onCreate中也可以状态恢复,但有时候需要所有布局初始化完成后再恢复状态。

    Activity的启动模式,每个启动模式的不同点是什么?

    启动模式简单的说就是定义Activity实例与tack的关联方式

    为什么定义启动模式:

    • 让某些Activity启动一个新的task
    • 让activity复用,而不是重新创建一个实例

    定义方式:

    • 使用manitest文件,通过Activity的 android:launchMode="standard"属性
    • intent设置:靠Flag
      • FLAG_ACTIVITY_NEW_TASK:指定为singleTask模式
      • FLAG_ACTIVITY_SINGLE_TOP:指定为singleTop模式
      • FLAG_ACTIVITY_CLEAR_TOP:标识此Activity,当它启动时,在同一个任务栈中位于它上面的Activity都要出栈
      • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:标识此Activity不会出现在历史Activity的列表中

    哪些启动模式:

    • standard 标准模式:总会为activity创建一个新的实例,并将该实例添加到当前task中,这种方式不会启动新的Task,只是将新的 Activity添加到原有的Task中。
    • singleTop:栈顶复用模式,这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时他的onNewIntent方法会被回调。
    • singleTask:栈内复用模式
    • singleInstance:单实例模式,此种模式的Activity只能单独的位于一个任务栈中

    如何在非活动Activity内存不足时被系统销毁前保存数据?

    Activity中提供了一个方法:onSavedInstanceState(Bundle obj).当系统销毁一个Activity时,会将Activity的状态信息已键值对形式存放在bundle对象中. 第一次启动Activity时,这个bundle对象是空的,null.如果Activity被系统销毁了,然后用户要回退回去看的话,系统会调用这个Activity的onCreate方法,并把bundle对象传递过去.

    横竖屏切换时,Activity的生命周期会有那些变化?

    1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
    2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
    3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

    Activity如何设置为Dialog样式?

    在AndroidManifest.xml 中定义Activity的地方一句话android:theme=”@android:style/Theme.Dialog”或android:theme=”@android:style/Theme.Translucent”就变成半透明的,也可以在onCreate代码中设置主题。

    Context,Application,Activity的区别与联系?

    Context:提供应用环境全局信息的接口,并且这个接口是由抽象类实现的,它的执行被android系统所提供,允许我们获取以应用为特征的资源和类型,同时启动应用级的操作,如启动Activity,broadcasting和接收intent。

    Application-Context的生命周期与Application的生命周期相关,context随着Application的销毁而销毁,伴随application的一生,与Activity的生面周期无关。

    Activity-Context:这个Context的生命周期是和得到它的引用的Activity一样长,如果这个Activity结束了,那么,这个Context也会得到释放

    使用context的时候,要小心内存泄漏,防止内存泄漏

    • 不要让生命周期长的对象引用Activity context,即保证引用activity的对象要与activity本身生命周期是一样的
    • 对于生命周期长的对象,可以使用Application-context
    • 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部类对象引用导致的生命周期的变化。

    Activity之间进行数据传递的方式有哪些?

    • intent传递数据
    • 先把数据保存到本地,然后在下一个Activity中从本地获取,存储方式可以是四种持久化存储方式:SharePreferences,SQlite,Content Provider和File
    • 使用EventBus类似的事件总线
    • 使用广播

    如何退出Activity?如何安全退出已调用多个Activity的Application?

    • 记录打开的Activity:每打开一个Activity,就记录下来,在需要退出时,关闭每一个Activity,Activity记录可在自定义的Application执行,Application可实现一个接口,该接口会返回相应启动或销毁的Activity实例
    • 在需要结束应用时,发送一个特定的广播,每一个Activity收到广播后关闭
    • 通过intent的flag来实现,根据应用界面的交互场景利用Activity的启动模式来设计。

    相关文章

      网友评论

          本文标题:day4 Activity相关

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