什么是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相关相关推荐

  1. Task和Activity相关(转)

    http://www.cnblogs.com/xirihanlin/archive/2010/06/03/1750811.html 这段时间在做一个项目,发现对Task和Activity掌握的还是不牢 ...

  2. Android的Task和Activity相关

    android:allowTaskReparenting    用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)--"true& ...

  3. dumpsys activity 相关命令解析

    相关命令: adb shell dumpsys activity-------------------AMS所有信息 adb shell dumpsys activity activities---- ...

  4. Android Studio 单刷《第一行代码》系列 04 —— Activity 相关

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  5. Android笔记-Activity相关+内存泄漏

    看了下,上次学习android还是17年的事情,,,,两年过去了我现在终于来搞android了... 以下内容参考自:<Android从学习到产品>,<深入理解java虚拟机> ...

  6. Activity与Fragment的生命周期详解

    在安卓中Activity与Fragment是非常相似的两个类,它们各自都拥有自己的生命周期,且都可以用来显示布局文件中的视图.其中Activity是通过setContenView()显示视图,而Fra ...

  7. android activity启动流程_1307页!一线大厂Android面试全套真题解析!

    /   前言   / 金九银十到了,很多读者都反映有面试的需求,所以我特地给大家准备了一点资料! 下面的题目都是大家在面试一线互联网大厂时经常遇到的面试真题和答案解析,如果大家还有其他好的题目或者好的 ...

  8. Android性能优化面试题,与性能优化相关面试题 - 与IPC机制相关面试题 - 《Android面试宝典》 - 书栈网 · BookStack...

    源码分析相关面试题 Activity相关面试题 与XMPP相关面试题 与性能优化相关面试题 与登录相关面试题 与开发相关面试题 与人事相关面试题 与人事相关面试题现在三四月份,金三银四最好找工作时间, ...

  9. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动过程 | 静态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. 谈谈读“SEO实战密码”的一些感悟
  2. 几个基于jvm 的微服务框架
  3. 【论文解读】DeepFM论文总结
  4. Python Django模板语法标签代码示例(页面渲染与取值)
  5. python os.system关闭log_又到牛市!带你学习一个python强大证券数据分析工具
  6. Sklearn 损失函数如何应用到_机器学习大牛最常用的5个回归损失函数,你知道几个?...
  7. jetty9更改post请求长度
  8. java写入文件的几种方法分享
  9. 自动化测试pytest测试框架实例
  10. java 允许魔术变量_PHP超级全局变量、魔术变量和魔术函数汇总整理
  11. ai里怎样取消扩展外观_扩展AI:困难的5个原因
  12. html基础 — area(图像的作用区域标记)
  13. QCC3040----SOC模块
  14. java nio 详_java NIO 详解
  15. 推荐一个易学预测、学术研讨、资源分享网站:龙腾易学网
  16. Android多线程理解
  17. POCO中的异常处理和调试
  18. BarTender打开提示:错误消息#2622
  19. 微机原理之8255和8253的初始化
  20. 知识点滴 - 什么是当量

热门文章

  1. sparkContext之一:sparkContext的初始化分析
  2. Linux任务高度进程crond的使用
  3. 红外协议之NEC协议
  4. 仿FLASH动感十足鼠标滑过放大的菜单代码
  5. TLS1.3 协议的Golang 实现——ClientHello
  6. 在 Shell 脚本里使用数组
  7. Spring3+MyBatis3整合无法输出SQL语句问题的解决
  8. 条款02:尽量以const,enum,inline代替#define
  9. .net中日至框架log4net.dll如何使用
  10. 阿里云移动端播放器高级功能---直播时移