文章目录
- 1.在Activity进行配置时,catrgory和action的区别是什么 ?
- 2.Activity中分别在onCreate,onStart,onResume中调用finish后的生命周期如何回调 ?
- 3.简述锁定屏与解锁屏幕,Activity 生命周期 ?
- 4.简述对Activity中onNewIntent()方法的认识 ?
- 5.如果一个Activity启动比较慢,需要优化,你觉得可以从哪些方面入手 ?
1.在Activity进行配置时,catrgory和action的区别是什么 ?
在Activity进行配置时,<category>
和<action>
是两个不同的元素,它们各自扮演着不同的角色,用于描述Intent的不同方面。以下是它们之间的主要区别:
1. 定义与用途
<action>
标签:- 定义:
<action>
标签用于定义Intent的动作(Action),它指定了Intent想要执行的具体操作。属性值为一个字符串,用于匹配Intent与Activity之间的操作。 - 用途:
<action>
标签使得Intent能够明确指定它想要启动的Activity应该执行的操作。例如,打开相机、发送短信等。
- 定义:
<category>
标签:- 定义:
<category>
标签用于指定当前动作(Action)被执行的环境或条件,它进一步细化了Intent的意图。属性值也是一个字符串,用于描述操作的特定属性或要求。 - 用途:
<category>
标签使得Intent能够更精确地匹配到合适的Activity。通过指定Category,可以确保只有满足特定条件或环境的Activity才能响应Intent。
- 定义:
2. 匹配规则
<action>
的匹配规则:- Intent中必须至少携带一个action,且该action必须在目标Activity的
<intent-filter>
中有对应的匹配项。如果Intent携带了多个action,那么目标Activity的<intent-filter>
中必须包含所有这些action才能匹配成功。
- Intent中必须至少携带一个action,且该action必须在目标Activity的
<category>
的匹配规则:- Intent可以没有category,但一旦指定了category,那么目标Activity的
<intent-filter>
中必须包含Intent中指定的所有category才能匹配成功。默认情况下,所有Intent都会携带一个android.intent.category.DEFAULT
的category,除非显式地通过addCategory()
方法添加其他category。
- Intent可以没有category,但一旦指定了category,那么目标Activity的
3. 示例
假设有一个Intent想要启动一个发送短信的Activity,配置可能如下:
<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter>
在这个例子中,<action>
标签指定了Intent想要执行的操作是发送(SEND),而<category>
标签则指定了这个操作应该在默认环境下执行(DEFAULT)。同时,通过<data>
标签进一步指定了操作的数据类型(text/plain),即纯文本消息。
4. 总结
<action>
和<category>
都是Intent中用于描述操作的重要元素,但它们描述的角度不同。<action>
定义了Intent想要执行的具体操作,而<category>
则进一步细化了操作的环境或条件。- 在匹配规则上,
<action>
要求必须匹配,而<category>
则要求Intent中指定的所有category都必须匹配,除非Intent没有指定任何category(但默认会携带android.intent.category.DEFAULT
)。
2.Activity中分别在onCreate,onStart,onResume中调用finish后的生命周期如何回调 ?
在Android中,Activity的生命周期管理是通过回调一系列方法来完成的,这些方法包括onCreate()
, onStart()
, onResume()
, onPause()
, onStop()
, onDestroy()
等。当你在这些方法中调用finish()
时,会触发Activity的销毁过程,但是具体的回调顺序会根据finish()
被调用的位置有所不同。
在
onCreate()
中调用finish()
:onCreate()
onDestroy()
在
onCreate()
方法中调用finish()
会立即停止Activity的创建过程,并跳转到onDestroy()
方法进行销毁。在
onStart()
中调用finish()
:onCreate()
onStart()
onDestroy()
在
onStart()
方法中调用finish()
会停止Activity的启动过程,并跳转到onDestroy()
方法进行销毁。在
onResume()
中调用finish()
:onCreate()
onStart()
onResume()
onPause()
onStop()
onDestroy()
在
onResume()
方法中调用finish()
会先让Activity进入暂停状态(onPause()
),然后停止(onStop()
),最后销毁(onDestroy()
)。这是因为onResume()
是Activity与用户交互的起始点,所以在销毁之前需要确保Activity已经正确地进入了非活跃状态。
总的来说,无论在哪个生命周期方法中调用finish()
,最终都会导致Activity的销毁,但是具体的回调顺序会根据finish()
被调用的位置而有所不同。了解这些回调顺序对于理解Activity的生命周期以及编写健壮的Android应用是非常重要的。
3.简述锁定屏与解锁屏幕,Activity 生命周期 ?
在Android系统中,当设备锁定屏幕和解锁屏幕时,正在运行的Activity会经历一系列生命周期回调。这些回调帮助开发者管理Activity的状态,确保应用在用户与设备交互变化时能够正确地响应。
锁定屏幕时Activity的生命周期
当设备锁定屏幕时,通常意味着用户暂时离开了当前Activity,但Activity可能并未完全停止或销毁。此时,Activity的生命周期回调大致如下:
onPause():这是第一个被调用的回调方法,表示Activity正在失去用户焦点,但此时Activity仍然可见(部分情况下,如果锁屏界面是半透明的,Activity可能仍然部分可见)。在这个方法中,开发者应该释放那些不再需要的资源,比如停止动画、暂停视频播放等,以避免浪费系统资源。
onStop():紧接着
onPause()
之后,onStop()
方法会被调用。这表示Activity已经不可见,且用户无法与其交互。在这个方法中,开发者可以进行一些清理工作,比如保存用户编辑的数据到持久化存储中,以防Activity被系统销毁。
需要注意的是,如果设备在锁定屏幕时直接进入了休眠状态(比如用户按下了电源键),那么onStop()
之后可能紧跟着就是onDestroy()
,表示Activity被销毁了。但在大多数情况下,仅仅是锁定屏幕并不会导致onDestroy()
被调用,除非系统因为内存紧张而需要回收资源。
此外,如果Activity在清单文件中配置了特定的屏幕方向变化处理(如android:configChanges="orientation|screenSize"
),那么在屏幕方向变化时,Activity可能不会完全销毁并重建,而是直接调用onConfigurationChanged()
方法来处理变化。但这与锁定屏幕的情况不同,需要区分开来。
解锁屏幕时Activity的生命周期
当设备解锁屏幕时,用户可能会回到之前离开的Activity。此时,Activity的生命周期回调大致如下:
onRestart():如果Activity之前因为锁定屏幕而被暂停或停止,但在解锁屏幕时仍然存在于任务栈中,那么
onRestart()
方法会被调用。这表示Activity即将重新开始与用户交互。onStart():紧接着
onRestart()
之后,onStart()
方法会被调用。这表示Activity已经变得可见了,但此时可能还没有获得用户焦点。onResume():最后,
onResume()
方法会被调用。这表示Activity已经获得了用户焦点,可以开始与用户进行交互了。在这个方法中,开发者可以进行一些资源的重新获取或状态的恢复工作。
总结
锁定屏幕和解锁屏幕时Activity的生命周期回调是Android系统为了管理应用状态和资源而设计的重要机制。开发者需要熟悉这些回调方法,并在适当的位置编写代码来处理Activity的状态变化,以确保应用能够稳定、流畅地运行。同时,也需要注意不同设备和Android版本之间的差异,以及特定配置对生命周期回调的影响。
4.简述对Activity中onNewIntent()方法的认识 ?
onNewIntent()
方法在 Android Activity 的生命周期中扮演着特殊的角色。它主要用于处理单任务栈(singleTop)启动模式下的 Activity 的意图(Intent)更新。当一个 Activity 已经位于任务栈的顶部,并且系统尝试再次启动这个 Activity 时,系统会调用 onNewIntent()
方法,而不是创建一个新的 Activity 实例。
以下是关于 onNewIntent()
方法的一些关键点:
单任务栈启动模式:
onNewIntent()
方法主要与单任务栈启动模式(singleTop
)相关。在这种模式下,如果新的 Intent 已经指向任务栈顶部的 Activity,那么系统不会创建新的 Activity 实例,而是调用现有实例的onNewIntent()
方法。意图更新:当 Activity 在
singleTop
模式下已经位于任务栈顶部,并且接收到一个新的 Intent 时,onNewIntent()
方法会被调用。这允许 Activity 更新其内部状态以反映新的 Intent。默认行为:在默认情况下,即 Activity 的启动模式不是
singleTop
时,接收到新的 Intent 通常会导致创建 Activity 的新实例,并调用onCreate()
、onStart()
和onResume()
方法。用途:
onNewIntent()
方法可以用于多种场景,例如更新 Activity 的内容、处理来自不同来源的 Intent、或者在 Activity 已经运行的情况下改变其行为。注意事项:在使用
onNewIntent()
方法时,需要确保正确处理 Intent 数据,并更新 UI 以反映新的数据或状态。此外,还需要考虑 Activity 的其他生命周期方法,以确保应用的稳定性和响应性。
总之,onNewIntent()
方法是 Android Activity 生命周期中的一个重要部分,它允许开发者在 Activity 已经位于任务栈顶部时更新其 Intent 和状态。正确使用这个方法可以提高应用的性能和用户体验。
5.如果一个Activity启动比较慢,需要优化,你觉得可以从哪些方面入手 ?
如果一个Activity启动比较慢,需要优化,可以从以下几个方面入手:
1. 减少DEX文件大小
DEX文件是Android应用的可执行代码,其大小会直接影响应用的启动速度。优化DEX文件大小的方法包括:
- 使用ProGuard或R8进行代码混淆和压缩,删除无用代码和资源。
- 去除应用中未使用的库和资源,减少DEX文件加载的负担。
2. 优化Application初始化
Application的onCreate()方法是应用启动时的初始化入口,如果该方法中执行了过多的耗时操作,会直接影响Activity的启动速度。优化措施包括:
- 避免在Application的onCreate()中进行网络请求、数据库操作等耗时任务。
- 对于需要初始化的第三方SDK,考虑采用懒加载方式,即在实际使用到相关功能时再进行初始化。
3. 优化Activity加载
Activity的加载过程包括布局文件的解析、视图的渲染等,这些过程都可能成为启动速度的瓶颈。优化措施包括:
- 优化布局文件:减少布局文件的层级嵌套,使用ConstraintLayout等高效布局工具。避免在布局文件中使用过多的复杂控件和自定义控件,这些都会增加布局解析的时间。
- 异步加载数据:将Activity中需要加载的数据操作(如网络请求、数据库查询等)放在异步线程中执行,避免阻塞主线程。可以使用Handler、AsyncTask、Thread等机制来实现异步加载。
- 延迟加载视图:对于非立即需要的视图,可以使用ViewStub进行延迟加载,减少初始加载时的渲染负担。
4. 使用启动引导页或预加载数据
在Activity启动过程中,可以添加一个启动引导页来缓解用户的等待焦虑。同时,利用这个时间段预加载一些必要的数据,如应用配置、用户信息等,以减少后续页面的加载时间。
5. 使用启动优化库
市面上有一些第三方启动优化库,如Timberwolf和Jetpack Startup等,这些库提供了丰富的优化策略和工具,可以帮助开发者简化启动优化工作。
6. 其他优化措施
- 避免在onCreate()、onStart()和onResume()中执行耗时操作:这些生命周期方法中执行耗时操作会直接影响Activity的启动速度和用户体验。
- 检查并优化主线程操作:确保没有在主线程中进行耗时的I/O操作或复杂的计算任务。
- 利用Android Profiler等性能分析工具:通过这些工具可以分析应用启动过程中的性能瓶颈,找到需要优化的具体环节。
综上所述,优化Activity启动速度需要从多个方面入手,包括减少DEX文件大小、优化Application和Activity的加载过程、使用异步加载和延迟加载机制、添加启动引导页以及利用第三方优化库等。同时,还需要结合性能分析工具来定位和优化性能瓶颈。
答案来自文心一言,仅供参考