概述
上两节实现嘟宝二维码生成与创建,第二节美化二维码,实现二维码前后背景色与中心logo图片的设置,并生成一个可实现的工具类。 嘟宝通过mqtt在后台与服务器长久连接,嘟妈通过信令与嘟宝交互数据,建立音视频通信。 目前嘟宝远程监控软件实现功能如下:
- 开机自启动
- 前台服务,默默在后台运行
- 与中心建立mqtt实时通信
- 嘟宝ID,uuid唯一识别码
- 用嘟宝ID生成二维码,方便嘟妈首次添加时使用
嘟妈与嘟宝的第一次通信,应从扫描二维码开始。两者交互流程如下:
- 嘟宝app启动,显示二维码,并启动前台服务建立MQTT连接,订阅主题/dubao/dubaoID
- 嘟妈扫描二维码,向嘟宝发送绑定指令
- 嘟宝收到绑定指令后,通知栏消息手动确认绑定,发送确认指令给嘟妈
- 存储绑定信息
通知栏消息
嘟妈使用MQTT工具作为测试,发送首次绑定指令。嘟宝收到绑定指令后,将消息显示在通知栏,用户手动点击确认,是否予以绑定。 Android 通知栏消息是应用在后台时向用户传递简短、及时信息的重要方式。自 Android 8.0引入通知渠道、Android 13(API 33)引入运行时权限后,通知的实现方式有了标准化的要求。如下图: 
在Andorid 13 需要在AndroidManifest.xml声明权限
clike
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
创建栏消息的步骤:
- 获取通知管理器
- 创建一个通道channel,设置通道id
- 创建消息,指定消息通道
通知栏消息事例
- MainActivity创建一个按钮
- 点击按钮发送消息 MainActivity代码
clike
package com.zilong.dubao;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
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;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initBtn();
createNotificationChannel();
}
private void initBtn(){
Button button =findViewById(R.id.sendmsg);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendNotification();
}
});
}
private void createNotificationChannel() {
NotificationManager manager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = new NotificationChannel(
"DUBAO",
"嘟宝安心守护孩子安全",
NotificationManager.IMPORTANCE_DEFAULT
);
manager.createNotificationChannel(channel);
}
int id=1;
private void sendNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "DUBAO")
.setSmallIcon(R.drawable.logo)
.setContentTitle("新消息提醒")
.setContentText("您收到一条新消息"+id);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(id++, builder.build());
}
}
运行效果如下: 
关键函数解析
创建通道时,NotificationChannel构造函数有三个参数
- 通道id,发送消息时需要指定该通道id,创建通道通过应用程序信息查看到该通道内容
- 通道文字描
- 消息的行为、等级。有无声音、震动、横幅显示等,参数有7中。如下:
clike
重要性级别 值 行为表现 使用场景
IMPORTANCE_NONE 0 完全不显示,被静默拦截 禁用通知
IMPORTANCE_MIN 1 只显示在通知栏底部,无声音、无震动、无弹出 不重要的后台信息
IMPORTANCE_LOW 2 显示在通知栏,无声音、无震动 低优先级信息
IMPORTANCE_DEFAULT 3 有声音,无震动(默认行为) 普通通知
IMPORTANCE_HIGH 4 有声音、有震动,可能弹出横幅 重要消息
IMPORTANCE_MAX 5 最高优先级(已废弃,等同于 HIGH) 紧急通知
通道创建完成,可通过一下路径在手机中查看: 打开应用程序 > 嘟宝>通知管理> 通知类别>嘟宝安心守护孩子安全,如下图 
创建消息,消息分三个内容,标题、内容、图标。在manager.notify(id++, builder.build()),需要指定一个id,该id若相同,消息就只有一条,不会累加。
消息响应点击事件
用户查看消息时,会点击消息查看、操作,弹出Activity,同时给Activity传递参数。
- 创建MessageActivity用户显示消息操作
- 接收消息传来的参数 创建MessageActivity,右键com.zilong.dubao>new Activity>Empty Activity,输入MessageActivity
MainActivity源码
clike
package com.zilong.dubao;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
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;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initBtn();
createNotificationChannel();
}
private void initBtn(){
Button button =findViewById(R.id.sendmsg);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendNotification();
}
});
}
private void createNotificationChannel() {
NotificationManager manager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = new NotificationChannel(
"DUBAO",
"嘟宝安心守护孩子安全",
NotificationManager.IMPORTANCE_DEFAULT
);
manager.createNotificationChannel(channel);
}
int id=10;
private void sendNotification() {
// 创建点击通知的 Intent
Intent intent = new Intent(this, MessageActivity.class);
intent.putExtra("name","嘟妈id号"+id);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, id, intent,
PendingIntent.FLAG_IMMUTABLE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "DUBAO")
.setSmallIcon(R.drawable.logo)
.setContentIntent(pendingIntent)
.setContentTitle("新消息提醒")
.setContentText("您收到一条新消息"+id);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(id, builder.build());
id++;
}
}
MessageActivity源码
clike
package com.zilong.dubao;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class MessageActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
String name=getIntent().getStringExtra("name");
TextView id=findViewById(R.id.name);
id.setText(name);
}
}
运行效果如下图:
如图点击按钮,消息通知栏显示消息,点击消息,打开MessageActivity,MessageActivity接收来自消息的参数。 文中创建Channel内容不变。创建消息时,增加参数setContentIntent(pendingIntent),注意在创建pendingIntent ,必须保证id值唯一,否则传递参数是不变的。
clike
int id=10;
private void sendNotification() {
// 创建点击通知的 Intent
Intent intent = new Intent(this, MessageActivity.class);
intent.putExtra("name","嘟妈id号"+id);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, id, intent,
PendingIntent.FLAG_IMMUTABLE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "DUBAO")
.setSmallIcon(R.drawable.logo)
.setContentIntent(pendingIntent)
.setContentTitle("新消息提醒")
.setContentText("您收到一条新消息"+id);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(id, builder.build());
id++;
}
}