day4 Activity相关

什么是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的启动模式来设计。
上一篇:【C 语言】文件操作 ( 文件加密解密 | 加密解密原理 | 对称加密 | 非对称加密 | 散列函数 )


下一篇:JDBC常用操作 (java 的数据库连接)