概述
上节讲述嘟宝解释嘟妈扫描二维码发送的信令,经前台服务建立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。
运行程序显示如下:
打开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上下文设计完成。