Android手把手编写儿童手机远程监控App之通知栏消息

概述

上两节实现嘟宝二维码生成与创建,第二节美化二维码,实现二维码前后背景色与中心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++;
    }
}
相关推荐
OCN_Yang3 小时前
能告诉我:你为什么用 MVI 吗?反正我不理解!
android·架构·前端框架
荣月灵的小梅花4 小时前
Android 给广播接收器增加权限(permission)或signature签名权限
android
沐言人生4 小时前
ReactNative 源码分析4——ReactActivity之加载JSBundle
android·react native
砖厂小工6 小时前
Now In Android 精讲 10 - AGENTS.md:写给 AI Agent 的项目说明书
android
Ehtan_Zheng7 小时前
Jetpack Compose 动画转换编排的艺术
android
Ehtan_Zheng7 小时前
Jetpack Compose 动画入门:轻松掌握状态驱动的动画转换
android
Ehtan_Zheng7 小时前
Jetpack Compose 布局与可见性动画
android
_李小白8 小时前
【android opencv学习笔记】Day 12: HSV 色彩空间
android·opencv·学习
千里马学框架8 小时前
手机大厂Activity嵌套模式及三分屏SplitScreen功能调研报告-独家干货
android·智能手机·分屏·aaos·安卓framework开发·车机·三分屏