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

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

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

  • 16
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工程师老罗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值