尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

说透 `android:name=“.MyApplication“`

说透 `android:name=“.MyApplication“` 这一行看着简单但里面藏着几个新手容易懵的点。我把它拆开讲。先看这个点是啥android:name.MyApplication前面那个.很多人第一眼看不懂。它不是打错了也不是省略号它代表包名。啥意思呢你的项目肯定有个包名比如com.example.myapp就是那个每个类文件顶上写的package com.example.myapp。那个点就是这个包名的简写。所以android:name.MyApplication完整写出来其实是android:namecom.example.myapp.MyApplication系统看到开头是个点就知道哦前面把包名省了我自己补上。两种写法效果一样但第一种省事大家都这么写。它指向的是一个类这里要强调一个之前提过的点android:name后面跟的不是资源是一个类。别看它也带个点就以为跟mipmap/ic_launcher那些是一类。完全两码事mipmap/xxx—— 去 res 文件夹找资源.MyApplication—— 指向你写的一个 Java/Kotlin 类所以.MyApplication对应的是你项目里一个真实存在的类文件大概长这样packagecom.example.myapp;publicclassMyApplicationextendsApplication{// ...}如果你 Manifest 里写了.MyApplication但项目里根本没这个类App 一启动就崩。这个类是干啥的重点来了。application标签的android:name指定的是一个自定义 Application 类。这里得先搞清楚一个概念每个 App 运行时系统都会自动创建一个 Application 对象。这个对象有啥特点它是整个 App 里最先被创建的它活得最久从 App 启动到关闭一直都在整个 App只有一个它如果你不写android:name系统就用默认的 Application 类你也感觉不到它的存在。但如果你想在 App 启动的一开始就干点事就得自己写一个类去继承 Application然后在 Manifest 里通过android:name告诉系统“别用默认的了用我这个。”一般拿它来干嘛最典型的用途就是全局初始化。举个实际的场景。你 App 里接了一堆第三方 SDK比如推送、统计、崩溃收集啥的这些东西通常都要求你在 App 一启动就初始化好。那放哪初始化呢就放在自定义 Application 的onCreate里publicclassMyApplicationextendsApplication{OverridepublicvoidonCreate(){super.onCreate();// App 一启动就执行这里全局初始化都塞这推送SDK.init(this);统计SDK.init(this);崩溃收集.init(this);}}因为 Application 是最先创建的把初始化放这能保证后面任何界面用到这些 SDK 时它们都已经准备好了。除了初始化还常拿它存全局共享的数据——因为整个 App 就一个 Application 对象走到哪它都在放里面的数据谁都能拿到。完整走一遍流程串起来看就是这样第一步你写个类继承 Applicationpackagecom.example.myapp;publicclassMyApplicationextendsApplication{OverridepublicvoidonCreate(){super.onCreate();// 初始化的活儿放这}}第二步在 Manifest 里登记applicationandroid:name.MyApplication...第三步App 启动时系统看到这行就会创建你这个MyApplication而不是默认的然后自动调用它的onCreate。你的初始化代码就在这一刻执行了。几个容易踩的坑坑一类路径写错。.MyApplication里的类名必须和你实际写的类对得上包名也得对。写错了 App 直接崩而且报错信息有时不太直观容易找半天。坑二把它当资源引用。前面说过了它是类不是那种资源别搞混。坑三不写也没事别硬加。如果你的 App 压根没有全局初始化的需求其实可以不写android:name用系统默认的就行。别为了写而写专门整个空的 Application 类放那也没意义。小结一句话概括android:name.MyApplication就是告诉系统别用默认的 Application 了用我自己写的那个好让我在 App 启动时抢先做点全局初始化的事。那个开头的点是包名的简写后面跟的是类不是资源。搞清这两点这行代码就没啥神秘的了。
返回列表