当前位置: 首页 > 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 模块 总结 …...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...