当前位置: 首页 > news >正文

Android笔试面试题AI答之Activity(9)

文章目录

  • 1.如何在Application中获取当前Activity实例 ?
      • 方法一:使用全局变量或单例
      • 方法二:使用LocalBroadcastManager或EventBus
      • 方法三:通过Fragment
      • 方法四:使用Service和Intent
      • 注意事项
  • 2.Activity A跳转Activity B,再按返回键,生命周期执行的顺序 ?
      • 1. 从Activity A跳转到Activity B
      • 2. 从Activity B按返回键返回Activity A
  • 3.简述横竖屏切换,按home键,按返回键,锁屏与解锁屏幕,跳转透明Activity界面,启动一个 Theme 为 Dialog 的 Activity,弹出Dialog时Activity的生命周期 ?
      • 1. 横竖屏切换
      • 2. 按Home键
      • 3. 按返回键
      • 4. 锁屏与解锁屏幕
      • 5. 跳转透明Activity界面
      • 6. 启动一个Theme为Dialog的Activity
      • 7. 弹出Dialog时
  • 4.简述Activity的数据是怎么保存的,进程被Kill后,保存的数据怎么恢复的 ?
      • 数据的保存
      • 数据的恢复
  • 5.什么是ActivityManagerService吗?其发挥什么作用 ?

1.如何在Application中获取当前Activity实例 ?

在Android开发中,直接从一个全局的Application类中获取当前活动的Activity实例并不是一种推荐的做法,因为这违反了Android的组件间解耦原则,并可能导致内存泄漏等问题。然而,在某些特殊情况下,如果你确实需要这样做,有几种方法可以尝试,但请注意它们都有各自的限制和潜在问题。

方法一:使用全局变量或单例

虽然这不是直接从Application获取Activity,但你可以通过全局变量或单例模式来管理当前活动的引用。这种方法需要你手动在每个ActivityonResumeonPause(或onDestroy)中更新这个全局变量。

public class ActivityManager {private static Activity currentActivity;public static void setCurrentActivity(Activity activity) {currentActivity = activity;}public static Activity getCurrentActivity() {return currentActivity;}
}// 在你的Activity中
@Override
protected void onResume() {super.onResume();ActivityManager.setCurrentActivity(this);
}@Override
protected void onPause() {super.onPause();ActivityManager.setCurrentActivity(null); // 防止内存泄漏
}

方法二:使用LocalBroadcastManager或EventBus

如果你只是想在某个特定事件发生时通知Application或其他组件,可以使用LocalBroadcastManager(已弃用,推荐使用LiveDataViewModelEventBus等现代库)来发送和接收广播。这样,你就不需要直接引用Activity

方法三:通过Fragment

如果你的Application需要访问的是Fragment中的某些数据或方法,并且这个Fragment是某个Activity的一部分,那么可以考虑通过Fragment的回调接口来实现间接通信。

方法四:使用Service和Intent

对于需要在后台执行的任务,可以考虑使用ServiceService可以通过IntentActivity通信,但这种方式并不直接涉及从Application获取Activity实例。

注意事项

  • 内存泄漏:直接持有Activity的引用可能导致内存泄漏,特别是当Activity的生命周期结束时,如果仍然有引用指向它,那么它就不会被垃圾回收器回收。
  • 组件解耦:良好的应用设计应该尽量保持组件间的解耦,以便更容易地维护和扩展应用。

总之,直接从Application获取当前Activity实例通常不是最佳实践。如果确实需要跨组件通信,请考虑使用更现代、更安全的通信方式,如LiveDataViewModelEventBusIntent等。

2.Activity A跳转Activity B,再按返回键,生命周期执行的顺序 ?

在Android中,当从一个Activity(比如Activity A)跳转到另一个Activity(比如Activity B)时,并且之后用户按返回键从Activity B返回到Activity A,这两个Activity的生命周期执行顺序如下:

1. 从Activity A跳转到Activity B

  • Activity A:

    • onPause():Activity A不再处于前台,但还未完全不可见。
    • (可能紧接着)onStop():Activity A现在不可见。如果系统资源紧张,Activity A可能会被系统回收。
    • 注意:如果启动Activity B时使用了startActivityForResult(),那么Activity A还会在Activity B返回结果时调用onActivityResult()
  • Activity B:

    • onCreate():Activity B被创建。
    • onStart():Activity B变为可见状态,但还没有焦点。
    • onResume():Activity B现在处于前台,用户可以与之交互。

2. 从Activity B按返回键返回Activity A

  • Activity B:

    • onPause():Activity B不再处于前台,但还未完全不可见(实际上是即将被销毁)。
    • onStop():Activity B现在不可见。
    • onDestroy():Activity B被销毁。
  • Activity A:

    • onRestart():如果Activity A之前被停止(例如,由于Activity B的启动),则会调用此方法。如果Activity A从未停止(比如,从最近的任务列表中恢复),则不会调用此方法。
    • onStart():Activity A再次变为可见状态,但还没有焦点。
    • onResume():Activity A现在处于前台,用户可以与之交互。

这个生命周期的执行顺序是Android应用开发中非常基础且重要的概念,理解和掌握它对于开发稳定、高效的应用至关重要。

3.简述横竖屏切换,按home键,按返回键,锁屏与解锁屏幕,跳转透明Activity界面,启动一个 Theme 为 Dialog 的 Activity,弹出Dialog时Activity的生命周期 ?

在Android应用中,Activity的生命周期会受到用户操作和系统事件的影响,包括横竖屏切换、按Home键、按返回键、锁屏与解锁屏幕、跳转透明Activity界面以及启动一个Theme为Dialog的Activity等。下面分别简述这些情况下Activity的生命周期变化:

1. 横竖屏切换

  • 当屏幕从竖屏切换到横屏 或从横屏切换到竖屏时,默认情况下,Activity会被销毁并重新创建。因此,生命周期顺序是:onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()
  • 如果在AndroidManifest.xml中对Activity设置了android:configChanges="orientation|screenSize",则系统不会销毁并重新创建Activity,而是会调用onConfigurationChanged(Configuration newConfig)方法。此时生命周期变化仅包括:onPause() -> onConfigurationChanged() -> onResume()

2. 按Home键

  • 当用户按下Home键时,当前Activity会进入后台。生命周期顺序是:onPause() -> onStop()。如果后续系统资源紧张,该Activity可能会被系统回收,进而调用onDestroy(),但这通常不是由用户操作直接引起的。

3. 按返回键

  • 当用户按下返回键时,如果当前Activity不是任务栈的根Activity,则会调用onPause() -> onStop() -> onDestroy(),然后上一个Activity的onRestart()(如果已停止)、onStart()onResume()会被调用。
  • 如果当前Activity是任务栈的根Activity,则直接调用onPause() -> onStop() -> onDestroy(),通常不会回到另一个Activity。

4. 锁屏与解锁屏幕

  • 锁屏时,当前Activity会经历onPause() -> onStop()
  • 解锁屏幕后,如果当前Activity仍然可见(即用户之前并没有切换到其他应用),则会调用onStart() -> onResume()。如果Activity被系统回收了,则不会调用onStart()onResume(),而是需要用户重新进入该Activity。

5. 跳转透明Activity界面

  • 跳转到一个透明Activity时,当前Activity会经历onPause() -> onStop()。透明Activity的创建会遵循正常的生命周期顺序:onCreate() -> onStart() -> onResume()
  • 当从透明Activity返回时,透明Activity会先经历onPause() -> onStop() -> onDestroy(),然后原Activity的onRestart()(如果已停止)、onStart()onResume()会被调用。

6. 启动一个Theme为Dialog的Activity

  • 启动一个Theme为Dialog的Activity时,当前Activity会经历onPause()。Dialog Activity的创建同样遵循正常的生命周期顺序:onCreate() -> onStart() -> onResume()
  • 当关闭Dialog Activity时,它会经历onPause() -> onStop() -> onDestroy(),然后原Activity的onResume()会被调用(因为原Activity只是被暂停了,并未停止)。

7. 弹出Dialog时

  • 弹出Dialog时,Activity本身的生命周期不会受到影响。Dialog是依附在Activity上的,不会触发Activity的生命周期回调。但是,Dialog的显示和隐藏会影响到Activity的可见性和用户交互。

以上就是对各种情况下Activity生命周期变化的简述。

4.简述Activity的数据是怎么保存的,进程被Kill后,保存的数据怎么恢复的 ?

在Android开发中,Activity的数据保存与恢复是一个重要的机制,特别是在面对系统资源紧张导致进程被杀死时。以下是关于Activity数据保存与恢复的详细说明:

数据的保存

Android提供了多种方式来保存Activity中的数据,以便在Activity被销毁或进程被杀死后能够恢复这些数据。主要的保存机制包括:

  1. onSaveInstanceState(Bundle outState)方法

    • 当Activity即将被销毁,并且系统希望保存其当前的状态时(例如,由于屏幕旋转、用户按Home键后系统资源紧张等),系统会调用此方法。
    • 开发者可以在此方法中将需要保存的数据放入传入的Bundle对象中。这些数据可以是基本数据类型、字符串等简单类型,也可以是实现了Parcelable或Serializable接口的对象。
    • 保存的数据会在Activity重新创建时,通过onCreate(Bundle savedInstanceState)或onRestoreInstanceState(Bundle savedInstanceState)方法传递给Activity,以便恢复状态。
  2. SharedPreferences

    • SharedPreferences是一个轻量级的数据存储方案,用于保存应用的配置信息。它以键值对的形式存储数据,支持多种基本数据类型。
    • 数据以XML文件的形式存储在设备的内部存储中,因此即使进程被杀死,数据也不会丢失。
    • 适用于存储少量的、不需要频繁访问的数据,如用户偏好设置等。
  3. 内部存储和外部存储

    • 内部存储是指设备上的私有存储空间,其他应用无法访问。数据以文件的形式存储在这里,可以通过I/O流进行读写操作。
    • 外部存储通常指SD卡等可移除的存储设备。数据同样以文件的形式存储,但需要注意权限问题和存储路径的选择。
    • 这种方式适用于存储大量数据,如图片、视频等文件。
  4. 数据库(如SQLite)

    • SQLite是一个轻量级的数据库,支持结构化数据的存储和查询。
    • 数据存储在私有的数据库文件中,即使进程被杀死,数据也不会丢失。
    • 适用于需要存储大量结构化数据的应用场景。

数据的恢复

当进程被杀死后,Android系统会尝试重新启动该进程及其中的Activity。此时,可以通过以下方式恢复之前保存的数据:

  1. onCreate(Bundle savedInstanceState)或onRestoreInstanceState(Bundle savedInstanceState)方法

    • 如果Activity之前通过onSaveInstanceState方法保存了数据,那么这些数据会在Activity重新创建时通过Bundle对象传递给onCreate或onRestoreInstanceState方法。
    • 开发者可以在这些方法中读取Bundle中的数据,并恢复Activity的状态。
  2. SharedPreferences

    • 通过SharedPreferences的getXxx(String key, Xxx defaultValue)方法,可以读取之前保存的数据。
    • 在Activity的onCreate、onStart等方法中读取数据,并根据需要更新UI或执行其他操作。
  3. 内部存储和外部存储

    • 通过文件I/O操作读取之前保存在内部存储或外部存储中的文件。
    • 需要注意的是,在读取外部存储中的文件时,需要确保应用具有相应的权限。
  4. 数据库

    • 通过SQL查询语句从数据库中检索数据。
    • 可以在Activity的onCreate、onStart等方法中执行数据库查询操作,并根据查询结果更新UI或执行其他操作。

综上所述,Android提供了多种机制来保存和恢复Activity中的数据。开发者可以根据具体的应用场景和需求选择合适的数据保存和恢复方式。

5.什么是ActivityManagerService吗?其发挥什么作用 ?

ActivityManagerService(简称AMS)是Android系统中的一个重要服务。它主要负责管理和协调应用程序组件(如Activity、Service、BroadcastReceiver等)的生命周期,以及处理与任务栈、进程管理相关的任务。具体来说,ActivityManagerService的作用包括以下几个方面:

  1. 管理和协调应用程序组件的生命周期

    • ActivityManagerService负责启动、停止、暂停、恢复和销毁Activity等应用程序组件,确保它们按照预期的方式运行。
    • 它还跟踪和管理这些组件的状态,以便在系统资源有限时能够做出合理的调度决策。
  2. 管理应用程序的任务栈

    • 任务栈是应用程序组件的运行环境,ActivityManagerService负责创建、切换、移动和关闭任务。
    • 它确保任务栈的正确创建和维护,以提供用户友好的应用程序切换体验。
  3. 管理应用程序的进程

    • ActivityManagerService负责创建、杀死和调度应用程序进程。
    • 它监控应用程序的资源使用情况,根据系统资源的需求动态地管理进程,以确保系统的稳定性和性能。
  4. 处理应用程序之间的通信

    • ActivityManagerService负责协调不同应用程序之间的交互,如Intent的传递和Broadcast的派发。
    • 它确保应用程序之间能够正确地发送和接收消息。
  5. 管理系统中的其他服务

    • ActivityManagerService还负责与系统中的其他服务(如PackageManagerService、WindowManagerService等)进行交互,以确保整个系统的正常运行。
  6. 处理系统级别的广播事件

    • ActivityManagerService负责分发系统广播,如屏幕解锁、电量低等,并通知相关的应用程序或组件。
  7. 作为ActivityManager的实现者

    • ActivityManagerService是ActivityManager的底层服务接口,通过Binder机制与ActivityManager进行通信,提供对系统中其他组件的管理和监控功能。

综上所述,ActivityManagerService是Android系统中一个核心的系统服务,它协调了应用程序组件的生命周期、任务栈的管理、进程的调度以及系统服务的协同工作。通过这种方式,它确保了整个系统在用户和应用程序之间提供了一致、流畅的运行体验。

答案来自文心一言,仅供参考

相关文章:

Android笔试面试题AI答之Activity(9)

文章目录 1.如何在Application中获取当前Activity实例 ?方法一:使用全局变量或单例方法二:使用LocalBroadcastManager或EventBus方法三:通过Fragment方法四:使用Service和Intent注意事项 2.Activity A跳转Activity B&a…...

什么是嵌入式

1、什么是嵌入式 对专用设备的控制,把不需要的功能能够裁剪、删除,适配于专用设备,就叫做嵌入式(也叫做嵌入式系统) 嵌入式系统定义:用于控制、监视或者辅助机器和设备的运行 一个嵌入式系统由硬件和软件…...

SAM 2:Segment Anything in Images and Videos 论文详解

SAM 2:Segment Anything in Images and Videos 文章目录 SAM 2:Segment Anything in Images and Videos摘要1 Introduction具体分析 2 Related work具体分析: 3 任务:可提示的视觉分割4 模型具体分析具体分析 5 数据5.1 Data engine5.2 SA - V数据集 6 Z…...

PYTHON专题-(10)基操之我要玩并发

什么是并发? 并发指的是两个或多个事件在同一时间间隔内发生。在计算机科学中,并发通常指的是一个程序同时执行多个独立的任务。这些任务可以同时进行,而不会相互干扰或阻塞彼此。并发可以提高程序的执行效率和资源利用率,但也需要…...

双指针实现删除字符串中的所有相邻重复项

class Solution:def removeDuplicates(self, s: str) -> str:res list(s)slow fast 0length len(res)while fast < length:# 如果一样直接换&#xff0c;不一样会把后面的填在slow的位置res[slow] res[fast]# 如果发现和前一个一样&#xff0c;就退一格指针if slow …...

vue(vue2和vue3)项目打包去除console.log

1.Vue2去除 module.exports { configureWebpack: (config) > {// 取消console打印config.optimization.minimizer[0].options.terserOptions.compress.drop_console truereturn {name: "项目名称",resolve: {alias: {"": resolve("src")}}…...

Visual Studio 2022社区版、专业版、企业版功能对比表

https://visualstudio.microsoft.com/zh-hans/vs/compare/...

Codeforces 888 div3 A-G

A. Escalator Conversations 分析 二者身高差为k的倍数且不超过m-1倍&#xff0c;身高差不能为0&#xff08;即不能在同一个阶梯&#xff09; C代码 #include<iostream> using namespace std; void solve(){int n,m,k,H,ans0;cin>>n>>m>>k>>H;…...

IDEA如何去掉编辑框右侧的竖线

打开 IntelliJ Idea 软件 依次找到 File—>Settings—>Editor—>General—>Appearance 去掉勾选 Show hard wrap and visual guides (configured in Code Style options)...

3DCoat v2023 激活版下载与安装教程 (数字雕刻程序)

前言 3DCoat 是一款数字雕塑软件&#xff0c;由乌克兰开发。该软件专注于游戏模型的细节设计&#xff0c;集三维模型实时纹理绘制和细节雕刻功能为一身&#xff0c;可以加速细节设计流程&#xff0c;在更短的时间内创造出更多的内容。 一、下载地址 下载链接&#xff1a;分享…...

【Unity/XLua】xlua自带教程示例分析(一)——打印Hello world

第一步 创建Monobehavior脚本 public class Helloworld : MonoBehaviour {void Start(){} }第二步 在类中或Start函数中创建Lua虚拟机环境 LuaEnv luaenv new LuaEnv();第三步 使用LuaEnv的DoString方法直接运行字符串存储的lua语句&#xff08;字符串前使用可强制不进行转义…...

虚拟机(VMware16)安装rocky9.2详细过程,附镜像下载链接

rocky官方站点 链接: 官方站点 rocky9.2镜像下载路径 链接: Rocky-x86_64-dvd.iso 打开虚拟机&#xff0c;选择新建虚拟机 新建虚拟机 选择典型 由于VMware16没有rocky的版本&#xff0c;所以我们这里选择其他liunx 5.x 内核 64位 因为rocky9默认内核版本就是5开头的&#xf…...

C语言新手小白详细教程(6)函数

希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明为什么要使用函数&#xff1f;1.定义一个函数2.调用函数3.定义函数详解 开篇说明 截止目前&#xff0c;我们已…...

力扣1488.避免洪水泛滥

力扣1488.避免洪水泛滥 贪心 二分 将所有晴天存入集合用哈希表存每次池子上一次下雨的日期当下雨并且池子满了时&#xff0c;二分找到上一次下雨之后最近的晴天 class Solution {unordered_map<int,int> mp;public:vector<int> avoidFlood(vector<int>&a…...

System类、BigDecimal类、Calendar类 用法详解

System类 System 类是Java中的一个核心类&#xff0c;提供了访问与系统相关的一些属性和方法。它包含了一些静态字段和静态方法&#xff0c;用于获取系统的标准输入、标准输出、标准错误流&#xff0c;以及加载动态链接库和系统属性等功能。 常见方法&#xff1a; public stat…...

SQLTools插件下载与使用说明

SQLTools是一个专注于SQL优化与管理的plsql developer插件&#xff0c;目的是把一些常用的SQL收集在一起&#xff0c;方便快速解决问题&#xff0c;提高工作效率。 当在SQL或PACKAGE窗口,或者选中表时&#xff0c;会有两个右键菜单&#xff1a; SQLTools聚焦在SQL方面&#xf…...

【人脸识别】数据集宝藏合集,速看!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 26,090张人脸肤质缺陷采集数据【数据堂】 发布方&#xff1a; 数据堂&#xff08;北京&#xff09;科技股份有限公司 发布时间&#xff1a; 2021 简介&#xff1a; 26,090张人脸…...

mysql操作(进阶)

1.数据库约束 数据库自动对数据的合法性进行校验检查的一系列机制&#xff0c;目的是为了保证数据库中能够避免被插入或者修改一些非法数据。 &#xff08;1&#xff09;mysql中提供了以下的约束&#xff1a; a.NOT NULL&#xff1a;指定某列不能为null b.UNIQUE&#xff1…...

[000-01-025].第07节:WorkBench

我的后端学习大纲 我的Drools学习大纲 8. WorkBench 8.1 WorkBench简介: 1.WorkBench是KIE组件中的元素&#xff0c;也称为KIE-WB&#xff0c;是Drools-WB与JBPM-WB的结合体。它是一个可视化的规则编辑器。WorkBench其实就是一个war包&#xff0c;安装到tomcat中就可以运行。…...

JavaScript - 变量声明(let、const 和其他)

目录 一、引言 1. let 的作用 2. const 的作用 3. let 与 const 的选择 4. let 和 const 的性能 5. var, let, const 的对比 6. 常见误区 二、其他变量定义 1. var 关键字 2. 全局对象属性 3. 使用 IIFE&#xff08;立即调用函数表达式&#xff09; 4. ES6 模块 总结 …...

AC800PEC PC D231 3BHE025541R0101控制模块面价

AC800PEC PC D231 3BHE025541R0101控制模块面价 AC800PEC PC D231 3BHE025541R0101控制模块面价 AC800PEC PC D231 3BHE025541R0101控制模块面价 AC800PEC PC D231 3BHE025541R0101控制模块引脚线 AC800PEC PC D231 3BHE025541R0101控制模块说明书 AC800PEC PC D231 3BHE0…...

2024年3款免费录屏软件,你的电脑桌面上缺哪一个?

现在&#xff0c;不管是上网课、在家工作&#xff0c;还是拍视频&#xff0c;录屏软件都变得越来越重要了。想做个教学视频、录个操作指南&#xff0c;或者录个游戏的高光时刻&#xff0c;好的录屏软件都能帮你轻松搞定。这篇文章就是要聊聊免费录屏软件一般都有啥功能&#xf…...

Python爬虫新手指南及简单实战

网络爬虫是自动化获取网络信息的高效工具&#xff0c;Python因其强大的库支持和简洁的语法成为编写网络爬虫的首选语言。本教程将通过一个具体的案例&#xff08;基于Microsoft Edge浏览器的简单爬取&#xff09;&#xff0c;指导你使用Python实现一个完整的网络爬虫&#xff0…...

如何有效开展产业链招商?

产业链招商是一种以产业大数据为依托、以产业链图谱为基础、以产业链分析为核心、以完善产业链结构为目标的招商引资方式。相比于传统招商模式&#xff0c;产业链招商比拼的并不是土地、政策优惠&#xff0c;而是以产业链分析为核心&#xff0c;诊断区域产业链结构及长短板&…...

爬虫中使用多进程、多线程的混合方式遇到的数据丢失问题

项目场景&#xff1a; 网络爬虫项目&#xff0c;主要实现多进程、多线程方式快速缓存网页资源到MongoDB&#xff0c;并解析网页数据&#xff0c;将信息写入到csv文件中。 问题描述 在单独使用多线程的过程中&#xff0c;是没有问题的&#xff0c;比如这个爬虫示例是爬取豆瓣电…...

多云应用安全平台RegData利用MongoDB简化数据控制和合规流程

在高度规范化市场中&#xff0c;为了保障数据安全&#xff0c;企业可能需要部署一系列繁琐且成本高昂的IT基础设施系统。随着各项数据安全保护措施的出台&#xff0c;企业需要遵守的法规数量越多&#xff0c;尤其是跨越多个地域的企业&#xff0c;其IT基础设施就会越复杂。如今…...

VUE实现TAB切换不同页面

VUE实现TAB切换不同页面 实现效果 资源准备 ReceiveOrderList, TodoListMulti, SignList 这三个页面就是需要切换的页面 首页代码 <template><div><el-tabs v-model"activeTab" type"card" tab-click"handleTabClick"><…...

C++ 80行 极简扫雷

一共5346个字符&#xff0c;MinGW编译通过&#xff08;强烈不建议写这种代码&#xff01;&#xff01;&#xff01;&#xff09; 压行规则&#xff1a;一行不超过80个字符 代码&#xff1a; #include<windows.h> #include<stdio.h> #include<time.h> #def…...

常见VPS服务器附加组件一览

网络主机行业竞争非常激烈&#xff0c;因此主机服务提供商竭尽全力为客户提供完整的解决方案&#xff0c;其中包含构建和管理在线项目所需的一切。但客户通常有特定需求&#xff0c;因此需要不同的附加组件。在管理自己的网络服务器时尤其如此。 今天&#xff0c;我们将介绍您…...

Electron 使用Electron-build 进行打包

看完下面两篇就可以完成&#xff01; 基于vue3vite的web项目改为Electron桌面应用&#xff08;一&#xff09;_vue3转electron-CSDN博客 将web项目打包成electron桌面端教程&#xff08;二&#xff09;vue3vitets_vue3 打包桌面端-CSDN博客 打包报错 1. 首先确定依赖包 npm …...