🌟 童话:四大Context徽章诞生记

📜 背景设定:

在Android王国,每个组件都需要专属身份徽章(Context) 才能行使权力。王国的徽章工坊由ActivityThread大师掌管,他会根据不同身份铸造四种魔法徽章:


🏭 徽章铸造工坊全景


👑 第一章:皇冠徽章(Application Context)

身份象征 :王国最高统治者
铸造时刻 :App进程诞生时
铸造秘法

java

csharp 复制代码
// 在ActivityThread的秘法书中
public Application makeApplication() {
    Context appContext = ContextImpl.createAppContext();
    return new Application(appContext); // 注入皇冠之力
}

徽章特性

  • 💎 材质:钻石(永久存在)
  • ⚔️ 权限 :可调用系统服务,但不能操作界面
  • 寿命:与App同生共死
  • 🛡️ 安全守则:可放心传递,不会引发内存泄露

使用场景

当需要全局工具(如获取包名/资源)时亮出皇冠徽章:
context.getApplicationContext().getResources()


⚔️ 第二章:宝剑徽章(Activity Context)

身份象征 :前线指挥官
铸造时刻 :Activity启动时
铸造秘法

java

scss 复制代码
void performLaunchActivity() {
    // 用皇冠徽章的能量铸造宝剑
    ContextImpl context = ContextImpl.createActivityContext(
        getApplicationContext(), // 皇冠能量源
        displayId,               // 战场地图
        activityToken            // 指挥官信物
    );
    activity.attach(context); // 绑定徽章
}

徽章特性

  • 🔥 材质:火焰水晶(随Activity销毁而熄灭)
  • 🎨 特殊能力:携带主题(Theme)/窗口(Window)魔法
  • ⚠️ 禁忌:不可放入静态宝箱(会导致内存泄露!)
  • 🧭 定位能力:内含当前任务栈信息

战斗指令

java

arduino 复制代码
// 启动新战场
context.startActivity(new Intent(...));
// 显示作战地图
context.showDialog(new AlertDialog(...));

⚙️ 第三章:齿轮徽章(Service Context)

身份象征 :后勤工程师
铸造时刻 :Service启动时
铸造秘法

java

scss 复制代码
void handleCreateService() {
    // 复用皇冠徽章的核心能量
    ContextImpl context = ContextImpl.createAppContext(
        getApplicationContext(), 
        serviceInfo
    );
    service.attach(context); // 绑定齿轮
}

徽章特性

  • 🔩 材质:精钢(比宝剑徽章更坚固)
  • 🌙 工作模式:可日夜不息地后台运转
  • 🚫 能力限制:没有界面魔法
  • 🔗 绑定机制:可连接其他组件组成齿轮组

任务示例

java

scss 复制代码
// 启动后台任务
context.startService(new Intent(...));
// 连接其他齿轮
context.bindService(conn, BIND_AUTO_CREATE);

⚡ 第四章:闪电徽章(Broadcast Context)

身份象征 :传令信使
铸造时刻 :广播发送/接收瞬间
铸造秘法

java

scss 复制代码
void handleReceiver() {
    // 临时锻造轻量级徽章
    ContextImpl context = new ContextImpl();
    receiver.onReceive(context, intent); // 传递即销毁
}

徽章特性

  • 🌪️ 材质:闪电(瞬间存在)
  • ⏱️ 时效:必须在10秒内完成任务
  • 📨 传递方式 :只存在于onReceive()期间
  • 🚷 禁术:不可启动界面/绑定服务

紧急任务

java

csharp 复制代码
public void onReceive(Context context, Intent intent) {
    // 收到电量警报!
    if(Intent.ACTION_BATTERY_LOW.equals(intent.getAction())){
        // 只能执行快速任务
        context.sendBroadcast(new Intent("SAVE_DATA_NOW"));
    }
}

� 第五章:徽章安全实验室

🔥 危险实验:混淆徽章身份

java

arduino 复制代码
// 错误!用皇冠徽章执行界面魔法
applicationContext.showDialog(dialog); 
// 后果:抛出WindowManager.BadTokenException

// 错误!将宝剑徽章放入静态保险箱
class LeakTrap {
    static Context sActivityContext; // 内存泄露!
}

✅ 安全守则:

操作 皇冠徽章 宝剑徽章 齿轮徽章 闪电徽章
放入静态变量 ✅ 安全 ❌ 危险 ⚠️ 谨慎 🚫 不可能
启动Activity ❌ 禁止 ✅ 安全 ✅ 安全 ⚠️ 需FLAG
绑定Service ✅ 安全 ✅ 安全 ✅ 安全 ❌ 禁止
发送广播 ✅ 安全 ✅ 安全 ✅ 安全 ✅ 安全
获取系统服务 ✅ 安全 ✅ 安全 ✅ 安全 ✅ 安全

🏰 第六章:徽章生命周期图谱


🚨 第七章:错误使用灾难现场

💥 案例1:在Application弹Dialog

java

scss 复制代码
// 魔法反噬!Application无界面能力
((Application)context).getSystemService(LAYOUT_INFLATER_SERVICE);
// 抛出异常:Unable to add window --- token null is not valid

💥 案例2:Broadcast中执行耗时操作

java

typescript 复制代码
public void onReceive(Context context, Intent intent) {
    Thread.sleep(30000); // 魔法冻结!
    // 10秒后系统强制终止ANR
}

💥 案例3:用Activity Context启动长期Service

java

kotlin 复制代码
// 当Activity销毁时:
val intent = Intent(this, MyService::class.java) // this=Activity
startService(intent) 

// 危险!Activity被Service持有导致无法回收

🧙 终极徽章选择指南:

java

typescript 复制代码
public class ContextSelector {
    public static Context choose(Context source, String taskType) {
        switch(taskType) {
            case "UI_OPERATION": // 界面操作
                return findActivityContext(source);
                
            case "LONG_BACKGROUND": // 长期后台
                return source.getApplicationContext();
                
            case "QUICK_BROADCAST": // 广播任务
                return (source instanceof BroadcastReceiver) ? 
                       source : new BroadcastContext();
                       
            case "SAFE_STORAGE": // 安全存储
                return source.getApplicationContext();
                
            default: // 默认选择
                return source.getApplicationContext();
        }
    }
}

🏆 四大徽章能力对照表:

特性 皇冠徽章(Application) 宝剑徽章(Activity) 齿轮徽章(Service) 闪电徽章(Broadcast)
铸造者 ActivityThread ActivityThread ActivityThread ActivityThread
核心材料 应用全局信息 Window/Theme 后台任务栈 Intent数据包
界面能力 🚫 无 ✅ 完整 🚫 无 🚫 无
时效性 永久 中等 中等 瞬间(10秒)
内存风险 ⭐ 极低 ⭐⭐⭐⭐⭐ 极高 ⭐⭐⭐ 高 ⭐ 极低
典型使用场景 工具类初始化 启动对话框 音乐播放 接收系统广播
特殊能力 获取AppInfo 启动其他Activity 绑定跨进程服务 快速响应系统事件

🌈 徽章使用口诀:

全局用皇冠,界面拔宝剑
后台转齿轮,闪电传急令
静态勿藏剑,皇冠最安全
生命周期记,内存无风险!

从此,Android王国的组件们佩戴正确的身份徽章,各司其职,王国应用运行如精密钟表般井然有序! 🏰

相关推荐
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android