Activity

作者: eagerabu | 来源:发表于2021-02-24 16:47 被阅读0次

    一,初识
    由于Android系统资源的有限性以及不同场景需求的不同,Android四大组件可以对应不同的使用场景从而提高系统资源的利用率,同时四大组件分工明确,共同构成了可重用、灵活、低耦合的安卓系统。四大组件必须在AndroidManifest文件中进行注册才能使用,接下来说一下四大组件分别是什么以及他们的使用场景。

    • Activity
      基本概念:Activity是一个应用组件,持有一个Window窗口用于绘制和展示界面,接收和处理用户操作
      使用场景:主要负责与用户进行交互,展示页面给用户并能接收和处理用户的点击,滑动等操作事件并对用户操作做出相应的反馈
    • Service
      基本概念:Service相对于Activity没有相应的页面,生命周期较长,执行那些不需要和用户交互但需要长期运行 的任务
      使用场景:执行不需要与用户进行交互的任务,比如播放音乐等,用户在听歌曲的时候可以做其他操作提高了用户体验
    • BroadcastReceiver
      基本概念:BroadcastReceiver是一种消息型组件,用于在不同组件乃至不同应用之间传递消息。进行系统级别的消息通知,Android应用采用沙盒机制,不同应用之间相互隔离开来不能直接相互访问资源,而广播则提供了一种应用内组件间以及不同应用之间通信的方式
      使用场景:通过注册相应广播我们可以监听系统启动广播实现应用开机启动功能,监听wifi,数据等状态信息实现我们相应的功能,一个页面如果要对其他页面的动作做出相应反馈我们也可以通过自定义广播的方式作出相应的处理从而降低不同页面和组件间的耦合。
    • ContentProvider
      基本概念:Android采用了沙箱机制,可以保证各个应用程序相对独立和安全,可以免受其他应用程序的恶意修改和攻击保证数据的安全性,但是现实中不可能所有应用完全独立的,有时候就需要使用到其他应用提供的数据比如QQ获取我们的联系人信息就涉及到QQ和通讯录两应用间的数据共享,ContentProvider能够便利的向其他应用提供一个访问本应用数据的接口,还可以选择只对哪一部分数据进行共享,从而保证程序中的隐私数据不会有泄漏风险。
      使用场景:第三方应用读取联系人,日历和短信等信息,同时我们也可以给自己的应用定义一系列操作通过ContentProvider提供给其他应用程序使用。

    二,Activity详细介绍

    • Activity生命周期
    • 任务,任务栈
    • 启动模式
    • 进程和生命周期

    1, Activity生命周期

    Activity是具有生命周期的,在生命周期的不同阶段可以进行处理不同的工作和任务,接下来通过Google官方提供图示来学习。 image.png

    由图可以清楚的看到Activity在不同的情况下会走不同的生命周期,常见的生命周期有哪些呢?

    • 一般情况生命周期
      onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy()

    • 从Activity A 跳转到Activity B所经历的生命周期
      Activity A onPause() -> Activity B onCreate() -> Activity B onStart() ->Activity B onResume() -> Activity A onStop()
      按下返回键:Activity B onPause() -> Activity A onRestart() -> Activity A onStart() -> Activity A onResume() -> Activity B onStop() -> Activity B onDestroy()
      注意:由此可见Activity A进入 Activity B时会先执行Activity A的onPause()方法,如果我们在此方法中做了大量复杂或者资源释放工作会导致页面跳转出现延迟效果,造成不好的用户体验。

    • 当前Activity弹出Dialog弹窗不走生命周期

    • 启动一个主题为Dialog样式的Activity
      Activity A onPause() -> Activity B onCreate() -> Activity B onStart() -> Activity B onResume()
      点击返回:Activity B onPause() -> Activity A onResume() ->Activity B onStop() -> Activity B onDestroy()

    • 如果当前Activity启动模式为SingleTop,启动自身页面时生命周期
      onPause() -> onNewIntent() -> onResume()

    • 横竖屏切换时的生命周期
      未配置configChanges属性:会调用一个参数的onSaveInstanceState方法和onRestoreInstanceState()方法
      生命周期为: onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
      配置configChanges属性时:不调用任何生命周期方法 android:configChanges="orientation|screenSize|keyboardHidden"

    • 什么情况下Activity只走onPause() 不走onStop()?
      当启动一个Theme为Dialog的Activity时,只会执行onPause() 点击返回时执行onResume()

    • 什么情况导致Activity的onDestroy() 方法不执行?
      外部强制关闭进程或异常奔溃的时候
      生命周期长的对象持有当前Activity的引用handler比较多
      Activity被收集内存强制回收是不会调用destroy方法的

    2,任务任务栈
    任务:用户在执行某项任务时与之交互的一系列Activity集合
    返回栈:执行某项任务时用到的Activity会按照打开的顺序排列在一个返回堆栈中,当用户一直按返回按钮,Activity会从堆栈中按照后进先出的顺序退出知道返回主屏幕。移除堆栈中的所有Activity后,该任务将不复存在。

    任务是一个整体单元,当用户开始一个新的任务或者通过主屏幕按钮进入主屏幕时,任务可移至后台,当前任务失去焦点,举例来说,假设当前任务(任务 A)的堆栈中有 3 个 Activity,当前 Activity 下有 2 个 Activity。用户按主屏幕按钮,然后从应用启动器中启动新应用。主屏幕出现后,任务 A 转到后台。当新应用启动时,系统会启动该应用的任务(任务 B),该任务具有自己的 Activity 堆栈。与该应用互动后,用户再次返回到主屏幕并选择最初启动任务 A 的应用。现在,任务 A 进入前台,其堆栈中的所有三个 Activity 都完好如初,堆栈顶部的 Activity 恢复运行。此时,用户仍可通过以下方式切换到任务 B:转到主屏幕并选择启动该任务的应用图标。

    思考一个问题,Android管理任务和返回栈的方式是将所有接连启动的Activity放到同一任务和一个“后进先出”堆栈中,大多数应用页面的跳转都符合这种情况,但有些场景这种方式却不太适合,比如一个新闻列表页面,点击某个条目会进入详情显示页面,但有时点击没反应会多点击几次这样会导致详情页面打开多个,返回栈中存在了多个相同的详情页Activity,这个时候当我们点击退出时需要点击关闭详情页多次。再例如我们可能在多个应用中需要获取验证码,如果使用目前的管理模式短信详情页会被打开多次,使用特别混乱,因此就需要我们对任务和任务栈进行管理,这就用到了Android提供的启动模式。

    3,启动模式
    Android的启动模式可以指定Activity的启动方式,Activity启动模式有四种分别为"standard"(默认模式),"singleTop","singleTask","singleInstance“。

    standard:
    每次启动Activity都会创建新的Activity实例,无论所在回退栈里是否已经存在,每个实例可以属于不同任务,一个任务也可以有多个实例。
    singleTop:
    栈顶复用模式,如果要启动的Activity已经存在当前回退栈栈顶,则会直接利用已有的Activity而不会再重新创建新的Activity实例。
    singleTask:
    栈内复用模式,如果要启动的Activity已经存在于回退栈中,无论它是否在栈顶都不会重新创建新实例,启动此Activity会弹出此Activity之上的所有其他Activity从而使此Activity位于回退栈栈顶,直接使用。
    singleInstance:
    单例复用模式,使用了此模式的Activity单独使用一个回退栈,此Activity启动的其他Activity不会包含在此回退栈。

    指定Activity以那种模式启动有两种方式:通过Intent标记和清单文件中使用 <activity>元素的 launchMode属性指定

    launchMode属性指定:直接将launchMode值设置为standard或singleTop或singleTask或singleInstance
    Intent标记:启动 Activity 时,您可以在传送给 startActivity() 的 intent 中添加相应的标记来修改 Activity 与其任务的默认关联,intent标记包含FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_SINGLE_TOP,FLAG_ACTIVITY_CLEAR_TOP
    三种。
    FLAG_ACTIVITY_NEW_TASK:效果相当于singleTask。
    FLAG_ACTIVITY_SINGLE_TOP:效果相当于singleTop。
    FLAG_ACTIVITY_CLEAR_TOP:如果要启动的 Activity 已经在当前任务中运行,则不会启动该 Activity 的新实例,而是会销毁位于它之上的所有其他 Activity,并通过onNewIntent()将此 intent 传送给它的已恢复实例(现在位于堆栈顶部)launchMode 属性没有可产生此行为的值。

    清除返回堆栈

    如果用户离开任务较长时间,系统会清除任务中除根 Activity 以外的所有 Activity。当用户再次返回到该任务时,只有根 Activity 会恢复。系统之所以采取这种行为方式是因为,经过一段时间后,用户可能已经放弃了之前执行的操作,现在返回任务是为了开始某项新的操作。

    您可以使用一些 Activity 属性来修改此行为:
    alwaysRetainTaskState:如果在任务的根 Activity 中将该属性设为 "true",则不会发生上述默认行为。即使经过很长一段时间后,任务仍会在其堆栈中保留所有 Activity。

    clearTaskOnLaunch:如果在任务的根 Activity 中将该属性设为 "true",那么只要用户离开任务再返回,堆栈就会被清除到只剩根 Activity。也就是说,它与 alwaysRetainTaskState正好相反。用户始终会返回到任务的初始状态,即便只是短暂离开任务也是如此。

    finishOnTaskLaunch:该属性与 clearTaskOnLaunch类似,但它只会作用于单个 Activity 而非整个任务。它还可导致任何 Activity 消失,包括根 Activity。如果将该属性设为 "true",则 Activity 仅在当前会话中归属于任务。如果用户离开任务再返回,则该任务将不再存在。

    4,进程和生命周期
    Android系统为了在系统内存不足的时候应该终止那些进程,Android会根据每个进程中运行的组件以及组件状态,将他们放入”重要性层次结构“,这些层次结构包含以下五种。

    前台进程:当前正在与用户交互的Activity所在的进程
    可见进程:Activity可见但没有在前台所在的进程
    服务进程:Activity在后台开启了Service服务所在的进程
    后台进程:Activity完全处于后台所在的进程
    空进程:没有任何Activity存在的进程优先级最低

    系统内存资源不足是回收顺序为:空进程->后台进程->服务进程->可见进程->前台进程。

    相关文章

      网友评论

          本文标题:Activity

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