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

0 阅读4分钟

概述

上两节实现嘟宝二维码生成与创建,第二节美化二维码,实现二维码前后背景色与中心logo图片的设置,并生成一个可实现的工具类。 嘟宝通过mqtt在后台与服务器长久连接,嘟妈通过信令与嘟宝交互数据,建立音视频通信。 目前嘟宝远程监控软件实现功能如下:

  • 开机自启动
  • 前台服务,默默在后台运行
  • 与中心建立mqtt实时通信
  • 嘟宝ID,uuid唯一识别码
  • 用嘟宝ID生成二维码,方便嘟妈首次添加时使用

嘟宝功能图生成需求.png 嘟妈与嘟宝的第一次通信,应从扫描二维码开始。两者交互流程如下:

  • 嘟宝app启动,显示二维码,并启动前台服务建立MQTT连接,订阅主题/dubao/dubaoID
  • 嘟妈扫描二维码,向嘟宝发送绑定指令
  • 嘟宝收到绑定指令后,通知栏消息手动确认绑定,发送确认指令给嘟妈
  • 存储绑定信息

通知栏消息

嘟妈使用MQTT工具作为测试,发送首次绑定指令。嘟宝收到绑定指令后,将消息显示在通知栏,用户手动点击确认,是否予以绑定。 Android 通知栏消息是应用在后台时向用户传递简短、及时信息的重要方式。自 Android 8.0引入通知渠道、Android 13(API 33)引入运行时权限后,通知的实现方式有了标准化的要求。如下图: 在这里插入图片描述

在Andorid 13 需要在AndroidManifest.xml声明权限

 <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

创建栏消息的步骤:

  • 获取通知管理器
  • 创建一个通道channel,设置通道id
  • 创建消息,指定消息通道

通知栏消息事例

  • MainActivity创建一个按钮
  • 点击按钮发送消息 MainActivity代码
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中。如下:

重要性级别	值	行为表现	使用场景
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源码
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源码

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值唯一,否则传递参数是不变的。

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++;
    }
}