Android手把手编写儿童手机远程监控App之打造全局Context

0 阅读3分钟

概述

上节讲述嘟宝解释嘟妈扫描二维码发送的信令,经前台服务建立MQTT长连接接收信令,将信令发送消息通知栏,引导用户完成绑定事件。 在这里插入图片描述 完成上述功能,设计五个类:

  • MyService前台服务
  • MyMqttClient通信类
  • NotificationMsg消息通知类
  • uuid身份识别码类
  • QRCodeUtil二维码生成类 上述MyService拥有Context,其他四类都需要使用Context,这就使得每个类都需在构造函数中传递Context。 在 Android 开发中,Context 是一个非常重要的概念。简单来说,它代表了应用程序的当前环境。可以把它理解成一张“通行证”或“身份证”。有了它,应用组件才能访问系统资源和执行操作。它提供了访问以下资源的通道:
  • 资源文件:如字符串、图片、颜色、布局文件 (getResources())。
  • 系统服务:如获取 LayoutInflater(布局加载器)、ActivityManager(活动管理器)、NotificationManager(通知管理器) (getSystemService())。
  • 应用信息:如获取包名、应用版本信息(getPackageName(), getApplicationInfo())。
  • 启动组件:如启动 Activity、Service、发送 Broadcast(广播)。
  • 数据库与文件:操作应用专属的数据库和文件目录 (openFileInput(), getSharedPreferences(), getDatabasePath())。 在嘟宝工程,需要打造一个全局的Context ,使得类在设计时非常方便的拥有Context,操作资源。

全局获取Context技巧

核心方法:

  • 自定义 Application 类
  • 在 AndroidManifest.xml 中注册 Application 类是 Android 应用的基类,它代表了整个应用程序本身。在应用进程创建时初始化,在进程销毁时终止,是整个应用生命周期最长的组件。
    • 每个应用只有一个 Application 实例
    • 从进程创建到进程销毁,贯穿整个应用
    • 在 Activity、Service 等组件之前初始化
    • 可通过 Context 获取,适合存储全局状态

创建app类继承自Application

为了方便的获取Context,希望继承自Application类书写越简单越好。 创建类app,路径:右键com.zilong.dubao>New > Java Class 在这里插入图片描述 app源码

package com.zilong.dubao;

import android.app.Application;
import android.content.Context;
import android.widget.Toast;

public class app extends Application {
    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context=getApplicationContext();
        Toast.makeText(context,"全局获取Context",Toast.LENGTH_SHORT).show();
    }
    public static Context getContext(){
        return context;
    }
}

在 AndroidManifest.xml 中注册

<application
    android:name=".app"
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@drawable/fav"
    android:label="@string/app_name"

其中android:name=".app"指定类app,程序在启动时首先生成app类实例。在app onCreate函数中获取Context,并显示一个Toast。 运行程序显示如下:

260509 152244.gif 打开app,页面未显示,已经弹出Toast。

使用全局Context 重新封装身份识别码类

关于uuid类设计详解,请参考文章。 uuid类源码

package com.zilong.dubao;

import static android.content.Context.MODE_PRIVATE;
import android.content.Context;
import android.content.SharedPreferences;
import java.util.UUID;

public class uuid {
    private String createUUID(){
        String s="";
        s=UUID.randomUUID().toString();
        return s;
    }
    public String getuuid(){
        Context context=app.getContext();
        SharedPreferences  preferences=context.getSharedPreferences("uuid",MODE_PRIVATE);
        String uuid= preferences.getString("id","");
        if (uuid.equals("")){
            uuid=createUUID();
            SharedPreferences.Editor editor=context.getSharedPreferences("uuid",MODE_PRIVATE).edit();
            editor.putString("id",uuid);
            editor.apply();
            return uuid;
        }
        return uuid;
    }
}

MainActivity源码

package com.zilong.dubao;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.getuuid);
        TextView textView=findViewById(R.id.uuid);
        button.setOnClickListener((new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                uuid u=new uuid();
                u.getuuid();
                textView.setText(u.getuuid());
            }
        }));
}

activity_main.xml源码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:orientation="vertical">
    <TextView
        android:id="@+id/uuid"
        android:text="未获取"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/getuuid"
        android:text="获取uuid"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

运行程序如下: 在这里插入图片描述 核心源码,在uuid类函数getuuid,使用app.getContext()获取Context。 至此全局Context上下文设计完成。