业务场景

当用户打开应用时,系统发送Push消息给用户,向用户推荐博主信息。用户关注博主后,将保存用户的订阅信息,当关注的博主更新内容时,向订阅的用户发送短信,提醒用户及时查看最新内容。从而持续增强了用户的互动性。

向用户发送Push消息

1.在应用中集成推送服务

2.接收透传的Push消息。

3.在AndroidManifest.xml配置PushService,用于接收通知消息。

<service
android:name=".ui.PushService"
android:exported="false">
<intent-filter>
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service> <meta-data
android:name="push_kit_auto_init_enabled"
android:value="true" /

4. PushService继承自HmsMessageService,处理接收到的消息后, 使用自定义通知显示消息。

private void processWithin10s(RemoteMessage message) {
if (!TextUtils.isEmpty(message.getData())) {
JSONObject object = new JSONObject(message.getData());
String title = object.optString("title") + "";
String content = object.optString("content") + "";
String articleId = object.optString("articleId") + "";
String authorId = object.optString("authorId") + ""; NotificationUtils.sendNotify(this, title, content, articleId, authorId);
}

使用云数据库存储信息

1.开通云数据库服务

2.新增和导出对象类型。新增Author、Article、SubscriptionRecord表,具体字段请下载Demo参考对应类名的实体类。

3.新增存储区

4.集成云数据库SDK

5.初始化云数据库。

public static void initAGConnectCloudDB(Context context) {
AGConnectCloudDB.AGConnectCloudDB.initialize(context);
}

6.调用getInstance(AGConnectInstance connectInstance, AGConnectAuth auth)方法获取对应数据处理位置的AGConnectCloudDB实例,并使用createObjectType创建对象类型。

mCloudDB = AGConnectCloudDB.getInstance(AGConnectInstance.getInstance(), AGConnectAuth.getInstance());
mCloudDB.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo());

7.创建Cloud DB zone配置对象,并打开该Cloud DB zone(以Cloud DB zone的同步属性为缓存模式、访问属性为公共存储区为例),详细请参考CloudDBZoneConfig

public void openCloudDBZoneV2() {
mConfig = new CloudDBZoneConfig(ZONE_NAME,CloudDBZoneConfig.CloudDBZoneSyncProperty.CLOUDDBZONE_CLOUD_CACHE,
CloudDBZoneConfig.CloudDBZoneAccessProperty.CLOUDDBZONE_PUBLIC);
mConfig.setPersistenceEnabled(true);
Task<CloudDBZone> openDBZoneTask = mCloudDB.openCloudDBZone2(mConfig, true);
openDBZoneTask.addOnSuccessListener(cloudDBZone -> {
mCloudDBZone = cloudDBZone;
addSubscription();
}).addOnFailureListener(e -> {
callBack.onPhotoErrorMessage("OpenCloudDBZone Failed: " + e.getMessage());
});
}

8.插入更新数据,用于存储新增或者修改的文章信息。

public void upsertArticle(Article article) {
Task<Integer> upsertTask = mCloudDBZone.executeUpsert(article);
upsertTask.addOnSuccessListener(cloudDBZoneResult -> {
ArrayList<Article> articles = new ArrayList<>();
articles.add(article);
callBack.onUpdate(articles);
}).addOnFailureListener(e -> callBack.onPhotoErrorMessage("upsert Error: " + e.getMessage()));
}

9.查询数据,用于查询所有文章信息。

public void queryAll() {
Task<CloudDBZoneSnapshot<Article>> queryTask = mCloudDBZone.executeQuery(
CloudDBZoneQuery.where(Article.class),
CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_FROM_CLOUD_ONLY);
queryTask.addOnSuccessListener(snapshot -> {
processQueryResult(snapshot);
}).addOnFailureListener(e -> {
callBack.onPhotoErrorMessage("queryAll Error: " + e.getMessage());
});
}

触发记录用户的订阅信息

1.开通云函数服务

2.本地编辑和打包操作云数据库的相关函数。

a.项目中引入AGC云数据库相关模块,并初始化认证信息。

const agconnect = require('@agconnect/common-server');
const clouddb = require('@agconnect/database-server/dist/index.js');
const SubscriptionRecord = require('./model/SubscriptionRecord.js');
let api_client_name = "./model/agc-apiclient-test.json";
let path = require('path');
let api_client_path = path.join(__dirname, api_client_name);
agconnect.AGCClient.initialize(agconnect.CredentialParser.toCredential(api_client_path));

let body = JSON.parse(event.body);//接收http触发器请求参数

b.初始化云数据库

try {
const agcClient = agconnect.AGCClient.getInstance();
clouddb.AGConnectCloudDB.initialize(agcClient);
const agconnectCloudDB = clouddb.AGConnectCloudDB.getInstance(agcClient);
const cloudDBZoneConfig = new clouddb.CloudDBZoneConfig('ArticleZone');
cloudDBZoneClient = agconnectCloudDB.openCloudDBZone(cloudDBZoneConfig);
let result = { "message": "openCloudDBZone success" };
logger.info(result);
} catch (error) {
let result = { "initDB message": error.message };
logger.info(result);
callback(result);
}

c.插入用户订阅信息到云数据库,用于存储用户订阅信息。

async function upsertSubscriptionRecord(SubscriptionRecord, callback, logger) {
if (!cloudDBZoneClient) {
console.log("CloudDBClient is null, try re-initialize it");
let result = { "message": "CloudDBClient is null" };
logger.info(result);
return;
}
try {
resp = await cloudDBZoneClient.executeUpsert(SubscriptionRecord);
console.log('The number of upsert record is:', resp);
let result = { "message": "upsertSubscriptionRecord success " };
logger.info(result);
} catch (error) {
let result = { "upsert err ": error.message };
logger.info(result);
callback(result);
}
}

d.查询订阅列表,用于判断用户是否订阅作者。

async function querySubscriptionRecordWithOrder(authorId, phone, callback, logger) {
try {
const cloudDBZoneQuery = clouddb.CloudDBZoneQuery.where(SubscriptionRecord.SubscriptionRecord).equalTo("authorId", parseInt(authorId)).equalTo("phone", phone);
const resp = await cloudDBZoneClient.executeQuery(cloudDBZoneQuery);
console.log('The number of query records is:', resp.getSnapshotObjects().length);
isSubscription = resp.getSnapshotObjects().length > 0 ? true : false;
if (isSubscription) {
// await sendSMS(phone);
}
} catch (error) {
let result = { "query err ": error.message };
logger.info(result);
callback(result);
}
}

3.创建云函数,将上一步打包的函数上传到该云函数中。

4.在上步创建的云函数中创建HTTP触发器

5.在应用客户端集成云函数SDK。

6.初始化云函数,调用HTTP触发器获取云数据库相关操作结果。

function = AGConnectFunction.getInstance();

HashMap<String, String> map = new HashMap();
map.put("type", "1");
map.put("articleId", msg.getArticleId());
map.put("authorId", msg.getAuthorId());
map.put("phone", MainApplication.phone);
map.put("uid", MainApplication.uid);
function.wrap("insert-article-$latest").call(map)
.addOnCompleteListener(new OnCompleteListener<FunctionResult>() {
@Override
public void onComplete(Task<FunctionResult> task) {
if (task.isSuccessful()) {
String value = task.getResult().getValue();
JSONObject object = new JSONObject(value);
String message = (String) object.get("message");
//云函数返回成功
} }
});

内容变更向关注用户发送短信

1.开通短信服务

2.调试向用户发送短信

测试功能

1.应用中新发布一个文章。

2.在AGC推送服务页面新增一条推送消息,推送给测试手机,手机是否收到消息提示用户有新内容发布,点击通知栏,是否可以跳转至详情页。

3.在详情页关注作者,检查数据库中是否已经存入相关信息。

4.重新发布一个文章,检查是否收到更新内容的推送消息。

下载Demo

获取Demo

​欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

【ACG】博主在专栏更新内容后,及时通知关注他的用户去阅读的更多相关文章

  1. 关于openstack 专业博主地址.后续更新

    首先官方文档要放的 https://docs.openstack.org/ 关于导入镜像方面说的很详细的. https://www.cnblogs.com/liawne/p/9322221.html ...

  2. Navicat Premium之MySQL客户端的下载、安装和使用(博主推荐)

    不多说,直接上干货! 前期工作 若需使用Navicat Premium,则需要先安装MySQL,在此就不叙述了.具体可见我的博客: MySQL Server类型之MySQL客户端工具的下载.安装和使用 ...

  3. Java工程师面试题,整理自网络与博主各种笔试面试,持续更新

    1.面向对象的特征有哪些方面? 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口. 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应.简单的说就是用同 ...

  4. 网络采集软件核心技术剖析系列(6)---将任意博主的全部博文下载到SQLite数据库中并通过Webbrower显示(将之前的内容综合到一起)

    一 本系列随笔目录及本节代码下载 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软 ...

  5. 网络采集软件核心技术剖析系列(5)---将任意博主的全部博文下载到内存中并通过Webbrower显示(将之前的内容综合到一起)

    一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...

  6. 安装Hue后的一些功能的问题解决干货总结(博主推荐)

    不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...

  7. python:爬取博主的所有文章的链接、标题和内容

    以爬取我自己的博客为例:https://www.cnblogs.com/Mr-choa/ 1.获取所有的文章的链接: 博客文章总共占两页,比如打开第一页:https://www.cnblogs.com ...

  8. 【FreeRTOS实战汇总】小白博主的RTOS学习实战快速进阶之路(持续更新)

    博主是个小白,打算把这段时间系统学习RTOS的文章统一整理到这里,另外本文会给出一些参考性资料和指导性建议: 本文宗旨 FreeRTOS 是由Richard Barry在2003年由设计的,由于其设计 ...

  9. 【STM32系列汇总】小白博主的STM32实战快速进阶之路(持续更新)

    我把之前在学习和工作中使用STM32进行嵌入式开发的经验和教程等相关整理到这里,方便查阅学习,如果能帮助到您,请帮忙点个赞: 本文的宗旨 STM32 只是一个硬件平台,同样地他可以换成MSP430,N ...

随机推荐

  1. 拉取服务器上的项目,svn认证失败

    解决方案: 在服务器上找到对应的项目路径,并修改authz: 我的是因为[group]组下(下图中34行),我写的是[demo:/],改为[/]就可以了.

  2. Timer和ScheduledThreadPoolExecutor的区别

    Timer 基于单线程.系统时间实现的延时.定期任务执行类.具体可以看下面红色标注的代码. public class Timer { /** * The timer task queue. This ...

  3. STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  4. LMC7660即-5V产生电路

    LMC7660为小功率极性反转电源转换器,通过LMC7660电路产生-5V电压,其芯片管脚定义如下表所示. LMC7660负电压产生电路如下图所示. 其中6脚当供电电压大于等于5V时该脚必须悬空,当供 ...

  5. ArrayList源码深度剖析,从最基本的扩容原理,到魔幻的迭代器和fast-fail机制,你想要的这都有!!!

    ArrayList源码深度剖析 本篇文章主要跟大家分析一下ArrayList的源代码.阅读本文你首先得对ArrayList有一些基本的了解,至少使用过它.如果你对ArrayList的一些基本使用还不太 ...

  6. 如何等待ajax完成再执行相应操作

    ajax广泛应用于异步请求,对于大多数业务来说,这是十分方便的,但对于一些特殊的业务,ajax的异步性会起到相反的作用. 例如在ajax请求成功后,后续的操作需要依赖ajax执行成功后的相应操作. / ...

  7. 挑战30天写操作系统-day2-汇编语言学习与Makefile入门

    1.介绍文本编辑器 这里,我们直接采用自己windows电脑自带的文本编辑器即可以完成制作要求 2.继续开发 下面先是对昨天使用的helloos.nas文件内容进行详细解释 ; hello-os ; ...

  8. 'cross-env' 不是内部或外部命令

    yarn start yarn run v1.22.10$ cross-env APP_TYPE=site umi dev'cross-env' 不是内部或外部命令,也不是可运行的程序或批处理文件.e ...

  9. 博客从 CloudBase 迁移至云主机

    迁移起因 原来的博客 其实从很久以前就想要写博客,但总是断断续续的,一直都没有认真地开始. 最终,决定使用静态博客工具作为自己博客的承载体.在多种工具的比较下,最终选择了 Hugo 并部署到 Gith ...

  10. windows10:vscode下go语言的适配

    ps:本篇依赖golang的sdk已经安装完成: url:https://www.cnblogs.com/mrwhite2020/p/16475731.html   一.下载vscode,选择wind ...