使用调试日志在 Activity 和 View Model 中演示 Android 生命周期的简单应用

Android Jetpack-Lifecycle 1.LifeCycle activity 和fragment 是有生命周期的,有时候,我们的很多操作需要写在生命周期的方法中,比如下载文件操作等,这样很多情况下会导致在activity的生命周期方法中写越来越多的代码,activity或者fragment 越来越臃肿,代码维护越来越困难。 使用lifecycle就可以很好的解决这类问题。 lifecycle通过实现LifecycleObserver 接口来监听生命周期,然后在activity和fragment中去注册监听。 几个重要的类和接口: . 阅读详情

该应用程序有 2 个屏幕(第一个屏幕和第二个屏幕)使用简单的撰写导航实现。

在屏幕之间导航对活动生命周期没有影响。但是,它可能会影响 View Model 生命周期,具体取决于您在何处实例化ViewModel.

我们先来看看Activity的生命周期。

实现 DefaultLifecycleObserver

这是官方的活动生命周期图,表示这些生命周期事件回调的调用时间。例如,在活动进入创建状态之前,onCreate()会调用事件回调。这适用于其余的生命周期状态。

请注意,onCreate()其余的是生命周期事件,而不是生命周期状态。

为了演示活动生命周期,您需要实现DefaultLifecycleObserver接口。然后,您覆盖所有函数并打印出不同的生命周期状态。

class MyLifeCycleObserver(private val name: String) : DefaultLifecycleObserver {

    private val tag = "LifeCycleDebug"

    override fun onCreate(owner: LifecycleOwner) {
        Log.d(tag, "$name: onCreate()")
    }

    override fun onStart(owner: LifecycleOwner) {
        Log.d(tag, "$name: onStart()")
    }

    override fun onResume(owner: LifecycleOwner) {
        Log.d(tag, "$name: onResume()")
    }

    override fun onPause(owner: LifecycleOwner) {
        Log.d(tag, "$name: onPause()")
    }

    override fun onStop(owner: LifecycleOwner) {
        Log.d(tag, "$name: onStop()")
    }

    override fun onDestroy(owner: LifecycleOwner) {
        Log.d(tag, "$name: onDestroy()")
    }
}

onCreate()在活动中,您在函数中注册此生命周期观察者。

class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        val observer = MyLifeCycleObserver(MainActivity::class.simpleName!!)
        lifecycle.addObserver(observer)

        /*...*/
        }
    }
}

由于某些原因,onRestart()回调在DefaultLifecycleObserver. 所以你还需要覆盖onRestart()你的活动。

class MainActivity : ComponentActivity() {
    /*...*/

    override fun onRestart() {
        super.onRestart()

        Log.d(
            "LifeCycleDebug",
            "${MainActivity::class.simpleName!!}: onRestart()")
    }
}

模拟活动失去焦点

为了演示当前活动生命周期已暂停(失去焦点),当前活动需要进入后台,但仍然可见。为此,您需要启动第二个具有透明背景的活动。

首先,您创建这个Loses Focus按钮来启动第二个活动。

val context = LocalContext.current
/*...*/
DefaultButton(
    text = "Loses Focus",
    onClick = {
        context.startActivity(Intent(context, SecondActivity::class.java))
    }
)

在AndroidManifest.xml中,添加第二个活动android:theme=“@android:style/Theme.Translucent”:

<activity
    android:name="com.example.understandlifecyclesdemo.ui.SecondActivity"
    android:exported="true"
    android:theme="@android:style/Theme.Translucent">
</activity>

单击按钮时,当前活动失去焦点。因此,它进入暂停状态。

活动生命周期摘要

尝试使用不同的场景并研究 Logcat 的输出。

这是所有不同场景的摘要。

设想活动生命周期事件回调
启动onCreate() → onStart() → onResume()
导航到不同的屏幕无过渡
开始第二个透明活动暂停()
按后退按钮(来自透明活动) onResume()
旋转屏幕onPause() → onStop() → onDestroy() → onCreate() → onStart() → onResume()
按主页按钮onPause() → onStop()
按方形按钮并选择应用程序onRestart() → onStart() → onResume()
关机(按返回键)onPause() → onStop() → onDestroy()
模拟进程死亡(按home键,手动杀死进程)onPause() → onStop()

请注意,在进程死亡时,不会触发 onDestroy() 事件回调。

要模拟进程死亡,您首先需要按主页按钮将活动移动到后台。之后,您手动终止该进程。终止进程的最简单方法是使用 logcat 中的停止按钮。

下面对每个生命周期状态进行更详细的描述:

活动生命周期状态描述
已创建活动已创建但不可见
开始活动在后台可见
已恢复活动在前台可见
毁坏活动被用户退出/关闭

请注意,没有Paused,Stopped和Restarted生命周期状态,我觉得这有点令人困惑。见下图。

ON_PAUSE 事件将生命周期状态发送到 STARTED。ON_STOP 事件将生命周期状态发送到 CREATED。

生命周期事件生命周期状态描述
ON_PAUSE开始活动已暂停且可见,仍处于前台
ON_STOP已创建活动不可见,从前台移动到后台
不适用重新启动Stopped 和 Started 阶段之间的中间状态

现在,让我们看看 View Model 生命周期。

ViewModel 何时创建和销毁?

View Model 中只有 2 个生命周期阶段:

  • ViewModel被建造。那是调用ViewModel 构造函数的时候。
  • ViewModel被摧毁。那是ViewModel.onCleared()被调用的时候。
class MainViewModel(private val name: String) : ViewModel() {  

    private val tag = "LifeCycleDebug"  

    init {  
        Log.d(tag, "${name}ViewModel: onCreated()")  
    }  

    override fun onCleared() {  
        super.onCleared()  

        Log.d(tag, "${name}ViewModel: onCleared()")  
    }  
}

由于MainViewModel接受构造函数参数(以区分ViewModel实例),因此您需要创建MainViewModelFactory

class MainViewModelFactory(private val name: String)  
    : ViewModelProvider.NewInstanceFactory() {  

    override fun <T : ViewModel> create(modelClass: Class<T>): T {  

        if (modelClass.isAssignableFrom(MainViewModel::class.java))  
            return MainViewModel(name) as T  

    throw IllegalArgumentException("Unknown ViewModel class")  
    }  
}

为了演示此视图模型生命周期,您ViewModel在 3 个不同的地方创建:

在 MainScreen() 中创建 ViewModel

@Composable  
private fun MainScreen() {  
    //view model store owner belongs to the activity
    val viewModel: MainViewModel = viewModel(
        factory = MainViewModelFactory("MainScreen"))  
    /*...*/
}

在 FirstScreen() 中创建 ViewModel

@Composable  
fun FirstScreen(  
    navigateToSecondScreen: () -> Unit  
) {  
    //compose navigation creates a new view model store owner for each destination  
  val viewModel: MainViewModel = viewModel(  
        factory = MainViewModelFactory("FirstScreen"))
  /*...*/
}

在 SecondScreen() 中创建 ViewModel

@Composable  
fun SecondScreen(  
    popBackStack: () -> Unit,  
) {  
    //compose navigation creates a new view model store owner for each destination  
  val viewModel: MainViewModel = viewModel(  
        factory = MainViewModelFactory("SecondScreen"))
}

查看模型生命周期摘要

让我们调查一下 Logcat,看看会发生什么。

设想查看模型生命周期状态
启动活动恢复后,创建主屏幕视图模型和第一个屏幕视图模型
导航到第二个屏幕创建第二个屏幕视图模型
弹回第一个屏幕第二个屏幕视图模型被破坏
旋转屏幕对查看模型生命周期没有影响
按返回并退出应用程序Activity 被销毁后,主屏幕视图模型和第一个屏幕视图模型被销毁

ViewModelStoreOwner确定视图模型生命周期。它设置为LocalViewModelStoreOwner.current取决于您调用viewModel()可组合函数的位置。

在MainScreen()中,在构建导航图之前,ViewModelStoreOwner属于活动。在FirstScreen()和SecondScreen()中,组合导航会ViewModelStoreOwner为每个屏幕目的地创建一个新的。然而,由于 First Screen 是根/起始目的地,它的生命周期与主屏幕视图模型非常相似,主屏幕视图模型与活动生命周期相关联。

因此,在活动恢复后,主屏幕视图模型和第一屏幕视图模型都被创建。第二个屏幕视图模型在被推送到堆栈时创建。当它从堆栈中弹出时,它会被销毁。

当应用程序关闭时,活动被破坏。之后,Main 和 First Screen 视图模型被销毁。下图总结了发生的情况。

结论

活动生命周期很常见并且有据可查。但是,视图模型的生命周期并不完全清楚,尤其是当它被销毁时。

在我对这个简单的应用程序进行测试之前,我的印象是,当可组合屏幕离开屏幕时,它的视图模型就会被破坏。我认为视图模型生命周期与可组合屏幕相关联。

好吧,事实并非如此。它基于导航的返回堆栈。当屏幕被添加到后台堆栈时,它的视图模型被创建。当它从后台堆栈中移除时,它的视图模型被破坏。

如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击文末卡片免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

Jetpack Lifecycle使用及原理解析 Jetpack Components 学习之 Lifecycle,Lifecycle 提供了可用于构建生命周期感知型组件的类和接口,可以感知 Activity、Fragment 的生命周期并根据 Activity、Fragment 的当前生命周期状态在其相应的回调事件中调整其自身的行为,能有效的避免内存泄漏。 阅读详情

相关推荐

Android架构灵魂组件Lifecycle的生命周期机制详解

在早期 Andorid 架构中,生命周期的事件监听和状态查询,我们需要自定义一套提供侦测功能的 Activity/Fragment 基类及回调接口,在 Activity/Fragment 的生命周期方法中实现依赖组件的操作,在外部进行事件监听和状态查询。这种模式会导致代码条理性很差而且会扩散错误。在 Lifecycle 引入后,可以避免在 Activity/Fragment 生命周期方法内写太多的业务逻辑处理代码,这样可以使我们的业务逻辑更加解耦。

maniuT的博客 567

@OnLifecycleEvent 遭废弃,推荐使用 DefaultLifecycleObserver 替代

近期 androidx.lifecycle 发布了 2.4.0 版本,此次更新中 @OnLifecycleEvent 注解被废弃,官方建议使用 LifecycleEventObserver 或者 DefaultLifecycleObserver 替代 现代的 Android 应用中都少不了 Lifecycle 的身影,正是各种 lifecycle-aware 组件的存在保证了程序的健壮性。 Lifecycle 本质是一个观察者模式的最佳实践,通过实现 LifecycleObserver 接口,开发者可

移动端开发干货分享 1万+

程序员转型安卓开发:核心技术栈与高效学习路径

安卓开发作为移动应用开发的重要领域,其核心技术栈包括Kotlin语言、Android SDK和Jetpack组件。Kotlin凭借空指针安全和简洁语法成为官方推荐语言,而Android SDK提供了构建应用所需的丰富API。理解MVVM架构和组件化设计是开发高质量应用的关键。对于有编程经验的开发者,可以快速掌握Activity生命周期、Fragment管理等核心概念,并通过Retrofit实现网络请求、Room处理本地数据存储。安卓开发环境配置如Android Studio优化和Gradle加速能显著提升开

weixin_34067102的博客 470

Android Lifecycle中两种Observer的使用方式

LifecycleObserver和DefaultLifecycleObserver的区别

qq_43666360的博客 3287

Android面试进阶:从八股文背诵到核心技术深度解析与实战应用

在移动开发领域,掌握核心机制与性能优化是构建高质量应用的基础。从Java/Kotlin语言特性到JVM内存模型,理解垃圾回收机制、并发编程原理是解决内存抖动和线程安全问题的关键。这些底层知识直接关联到Android开发中的性能表现与稳定性。深入Android Framework层,如Binder跨进程通信机制、View绘制链路及Activity生命周期管理,不仅是面试高频考点,更是优化应用启动速度、流畅度及架构设计的工程实践基础。通过剖析内存泄漏场景与LeakCanary等工具链,结合Handler机制、协

weixin_34166472的博客 458

Android调试进阶:adb shell核心命令实战指南与效率提升

在移动开发与测试领域,命令行工具是连接开发者与设备系统底层的桥梁,其核心价值在于提供超越图形界面的深度控制与问题诊断能力。Android Debug Bridge(adb)作为官方调试工具,其shell环境更是直接与Linux内核交互的入口,通过执行底层命令实现设备管理、性能监控和自动化操作。掌握adb shell不仅能高效完成应用安装、日志抓取和文件传输等常规任务,更能深入排查应用崩溃、性能卡顿和系统交互等复杂问题,是提升开发调试与测试效率的关键。本文聚焦adb shell的高频实战命令,涵盖设备连接、信

weixin_34327223的博客 390

Android面试进阶:从生命周期到架构设计,掌握核心原理与工程实践

在Android开发领域,理解核心组件原理与系统机制是构建稳定、高性能应用的基础。Activity、Fragment等组件的生命周期管理,不仅是面试高频考点,更是处理页面状态、数据恢复与内存管理的工程实践核心。其背后涉及系统对应用进程与任务栈的调度原理,深刻理解这些机制,能有效避免内存泄漏与状态不一致问题,提升应用健壮性。随着Jetpack架构组件的普及,ViewModel、LiveData等现代技术方案,为数据驱动UI和生命周期感知编程提供了标准化支持,推动了MVVM等架构模式在工程中的落地。这些技术价值

weixin_33713350的博客 476

Android天气应用开发指南:从环境搭建到架构设计

在移动应用开发领域,网络请求、数据解析与UI绘制是构建现代App的核心技术栈。其原理在于通过HTTP客户端与服务器交互获取数据,并利用异步编程模型处理耗时操作,确保界面流畅。这些技术的工程价值在于提升开发效率、保障应用性能与可维护性。在天气查询、新闻阅读等数据驱动型应用场景中,合理运用架构模式与工具链尤为关键。本文以构建一个Android天气应用为例,详细讲解如何结合Kotlin协程进行异步处理,并利用Retrofit高效管理网络请求,为开发者提供从零开始的完整项目实践路径。

weixin_34353714的博客 981

Android Fragment深度解析:从生命周期到通信与性能优化

在Android应用开发中,UI组件的模块化与复用是构建灵活、可维护界面的核心需求。Fragment作为Android架构的关键组件,其设计原理在于将Activity的界面逻辑拆分为独立、可复用的单元,每个Fragment拥有自己的生命周期和视图层次。这一机制的技术价值在于实现了UI的高度模块化,支持动态组合与替换,从而轻松适配不同屏幕尺寸(如手机与平板的布局差异),并优化了导航体验。通过FragmentManager和FragmentTransaction进行事务管理,结合后台栈支持,开发者能够构建流畅的

weixin_30315905的博客 457

IntelliJ IDEA开发Android APK:从环境配置到构建签名的完整指南

在软件开发领域,集成开发环境(IDE)是提升效率的核心工具,其通过集成代码编辑、编译、调试等功能,为开发者提供一站式解决方案。IntelliJ IDEA作为一款功能强大的跨平台IDE,凭借其出色的代码智能感知和插件生态,在Java和Kotlin开发中广泛应用。其技术价值在于提供了高度可定制和统一的环境,尤其适合需要管理多语言、多平台项目的开发者。在Android开发场景中,虽然Android Studio是官方推荐工具,但IntelliJ IDEA通过安装Android插件,同样能胜任APK的构建与调试任务

weixin_33882452的博客 414

安卓期末项目实战:从零构建一个MVVM架构的社区应用

在移动应用开发领域,客户端架构设计与性能优化是构建高质量应用的核心基础。MVVM(Model-View-ViewModel)作为一种主流架构模式,通过数据绑定实现了视图与业务逻辑的清晰分离,有效提升了代码的可维护性和可测试性。其技术价值在于能够优雅地管理界面状态,并响应数据变化。在实际工程实践中,结合Jetpack组件库,开发者可以高效处理网络通信、数据持久化等常见场景。例如,在开发一个包含用户交互与内容展示的社区类应用时,合理运用RecyclerView进行列表渲染与分页加载,并借助Glide等库优化图片

weixin_30482181的博客 922

Android开发必备:ADB命令实战指南与高级调试技巧

ADB(Android Debug Bridge)是连接计算机与Android设备进行调试和自动化操作的核心工具,其原理基于客户端-服务器架构,通过USB、网络或无线调试协议建立通信。掌握ADB命令不仅能提升开发调试效率,更是实现自动化测试、性能分析和设备管理的关键技术。在Android应用开发、测试及自动化部署等场景中,熟练运用ADB进行应用安装卸载、日志抓取、文件传输和设备信息获取,是工程师解决实际问题的基础能力。本文基于一线实战经验,系统梳理了ADB命令的知识体系,重点涵盖了设备连接、应用生命周期管理

weixin_30808693的博客 371

手把手调试AD9653的LVDS数据采集:从VIO抓波形到用F0/F8帧对齐的实战心得

本文详细介绍了AD9653高速ADC与Xilinx 7系列FPGA(如7z035)的LVDS数据采集调试实战经验。从硬件环境搭建、Vivado工具链配置到LVDS数据对齐技巧,重点分享了利用VIO抓取波形和使用F0/F8帧对齐的实用方法,帮助工程师快速解决高速数据采集系统中的信号完整性问题。

weixin_29169899的博客 705

Xamarin跨平台开发:Android原生应用实战指南

跨平台开发框架通过共享代码库显著提升移动应用开发效率,其中Xamarin采用独特的原生编译架构,将C#代码通过Mono运行时转换为平台特定机器码。这种技术原理使开发者既能使用.NET生态的强大功能,又能获得与Java/Kotlin开发相当的原生性能。在Android平台,Xamarin.Android通过JIT编译和完整的API绑定实现100%原生功能访问,特别适合需要深度集成设备特性的企业级应用开发。实际工程中,开发者需掌握Xamarin.Forms跨平台UI与Xamarin.Android原生控件的混合

weixin_33695082的博客 394

WSL2+Ubuntu20.04纯root环境搭建指南:告别权限烦恼的终极方案

本文提供了一份详细的WSL2+Ubuntu20.04纯root环境搭建指南,旨在为本地开发与学习打造一个免去权限干扰、极致流畅的Linux子系统环境。通过启用WSL2、安装Ubuntu 20.04,并执行核心的root用户设置,开发者可以彻底告别频繁的sudo操作,提升在文件操作、容器调试和系统配置等方面的效率。

time3的博客 474

“开宝五子棋陪练”-首款开放智能的五子棋习题练习安卓应用

使用Kotlin语言以及Jetpack Compose UI库开发,主要就是写Composable函数,显示棋盘、棋子和一些按钮,响应用户的点击和滑动操作,以及保存和恢复数据。但我针对本应用是用于做题的特殊需求,对该算法库做了一个简单的JNI层封装,方便UI前端Kotlin代码的调用。

weixin_44120030的博客 2398

Apache SkyWalking 动态配置 ZooKeeper 实现:配置详解、存储结构与源码原理

在 SkyWalking 后端(OAP Server)中,部分配置项支持从上游动态配置中心(Dynamic Configuration Center,DCC)热更新,而 ZooKeeper 是官方支持的 DCC 实现之一。本文基于仓库中的 `dynamic-config-zookeeper.md` 文档,完整讲解 ZooKeeper 动态配置的 YAML 参数、配置在 ZooKeeper 中的存储

gitblog_00160的博客 882

Camera HAL 多线程管理详解

本文摘要:Camera HAL 采用双线程管理体系(CAMX与CHI-CDK)实现高效并发处理。CAMX ThreadManager负责HAL内部及框架交互,采用线程池+任务调度机制,将节点处理、回调等封装为Job异步执行;CHI ThreadManager专注于OEM定制逻辑,支持异步/同步两种作业模式。两套系统通过函数指针解耦但共享地址空间,共同实现硬件流水线的强实时性。文章详细解析了两者的类层次架构、核心数据结构及典型应用场景,并提供了问题排查的代码切入点,为Camera HAL开发与性能优化提供指导

DU_YULIN的博客 57

Android开发性能优化与Systrace工具实战指南

性能优化是Android开发中的核心课题,系统级工具Systrace通过内核ftrace机制采集运行时数据,帮助开发者精准定位UI卡顿、功耗异常等性能瓶颈。在移动应用场景下,合理的性能优化可以显著提升用户体验和应用留存率。本文以Systrace工具为切入点,详解其工作原理和实战技巧,包括自定义Trace点植入、采集命令参数配置以及Alerts面板分析方法。同时结合View事件处理优化、Activity生命周期管理等高频开发场景,提供可落地的性能提升方案,助力开发者构建更流畅的Android应用。

weixin_33910385的博客 360

【软考高项论文】论信息系统项目管理的干系人绩效域

例如,在处理与电信运营商合作铺设光纤网络的问题时,考虑到其在通信设施建设和运维方面的专业性和重要性,我们将之定位为高权力高利益的干系人,给予了高度关注和优先沟通。项目全程,我们对干系人绩效域的执行效果进行了定期检查和评估,通过定量与定性的数据收集,确认了项目在干系人管理上的成效,具体表现为:建立了稳固的工作关系网络,使干系人普遍认可项目目标;鉴于本项目牵涉到政府各级部门、企事业单位、市民团体、技术研发伙伴等多种类型的干系人,且干系人的诉求和影响力各异,因此,有序且持续的干系人参与管理显得尤为关键。

Programming Talk 1683

直击高频编程考点:字符串知识及经典算法题总结

字符串相关基本练习题总结(最长公共子串、最长回文子串、最长无重复字符子串、最小覆盖子串、字符串相乘、中文数字表达转实际数字格式等)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

Android开发环境搭建与核心组件解析

Android开发环境搭建是移动应用开发的基础环节,其中Android Studio作为官方IDE集成了代码编辑、调试和性能分析工具链。开发环境配置涉及SDK管理、模拟器创建和网络代理设置等关键技术点,合理的工具链配置能显著提升开发效率。在Android框架层面,Activity生命周期管理、Service后台任务处理以及广播机制构成了应用的基础架构,这些核心组件通过特定的回调机制实现系统与应用的交互。随着Android系统版本迭代,运行时权限管理、后台限制等安全机制要求开发者遵循最佳实践。掌握ADB调试工

weixin_34185320的博客 427

大学生作业:80C51存储器数据传输实验:基本指令和数据传送

大学生作业:80C51存储器数据传输实验,报价 200 文章目录实验一、80C51存储器数据传输实验实验目的:实验内容一:基本指令实验内容二:数据传送 实验一、80C51存储器数据传输实验 实验目的: 熟悉软件的集成开发环境 掌握单片机软件设计流程,掌握存储器结构及各窗口之间的联系 掌握内部数据存储器、外部数据存储器的数据传送特点和应用; 实验内容一:基本指令 用三种方法实现将累加器A内容改为20H ORG 0000H LJMP MAIN ORG 0030H MAIN: ;方法一使用寄

weixin_54707168的博客 5115

Multi-Agent Orchestrator:3步跑通多Agent编排Demo的完整新手指南

Multi-Agent Orchestrator 是一个面向**多Agent编排**与复杂对话处理的开源框架。你不用手写"该谁回答"的逻辑,它会自动把每个问题分派给最合适的AI代理。无论你是做客服聊天机器人,还是想搭一支AI代理团队,照这份指南3步就能跑起来。 ## 先看效果:浏览器里的多Agent编排聊天界面 跑通演示应用后,你会得到一个聊天窗口。问天气,天气代理接手;聊订票,旅行代理接住;

gitblog_00125的博客 787

C#串口通信从入门到精通(21)——一个串口多线程发送数据

本文详细介绍了串口通信中采用多线程发送串口数据的解决方案,由多年实战经验总结,绝对干货!

qq_34059233的博客 3691

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android Launcher3深度定制:从源码编译到功能扩展实战

Android Framework是构建移动应用与系统交互的核心层,它定义了应用与操作系统之间的通信机制和基础服务。其原理在于通过Binder等IPC机制,为上层应用提供统一的系统服务接口,如Activity管理、窗口绘制和资源访问。掌握Framework层开发的技术价值在于,开发者能够突破应用层限制,实现深度的系统级功能定制与性能优化,这对于打造差异化产品体验至关重要。在众多应用场景中,系统启动器(Launcher)的定制尤为典型,它直接决定了用户与设备交互的第一印象。基于AOSP源码进行Launcher

weixin_34216107的博客 312

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: Jetpack: 使用自定义 NavType 组合导航
下一篇: 将 Stipop Stickers 与 Stream Flutter 应用程序集成
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值