【ACG】博主在专栏更新内容后,及时通知关注他的用户去阅读
业务场景
当用户打开应用时,系统发送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.开通短信服务。
测试功能
1.应用中新发布一个文章。
2.在AGC推送服务页面新增一条推送消息,推送给测试手机,手机是否收到消息提示用户有新内容发布,点击通知栏,是否可以跳转至详情页。
3.在详情页关注作者,检查数据库中是否已经存入相关信息。
4.重新发布一个文章,检查是否收到更新内容的推送消息。
下载Demo
欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh
【ACG】博主在专栏更新内容后,及时通知关注他的用户去阅读的更多相关文章
- 关于openstack 专业博主地址.后续更新
首先官方文档要放的 https://docs.openstack.org/ 关于导入镜像方面说的很详细的. https://www.cnblogs.com/liawne/p/9322221.html ...
- Navicat Premium之MySQL客户端的下载、安装和使用(博主推荐)
不多说,直接上干货! 前期工作 若需使用Navicat Premium,则需要先安装MySQL,在此就不叙述了.具体可见我的博客: MySQL Server类型之MySQL客户端工具的下载.安装和使用 ...
- Java工程师面试题,整理自网络与博主各种笔试面试,持续更新
1.面向对象的特征有哪些方面? 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口. 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应.简单的说就是用同 ...
- 网络采集软件核心技术剖析系列(6)---将任意博主的全部博文下载到SQLite数据库中并通过Webbrower显示(将之前的内容综合到一起)
一 本系列随笔目录及本节代码下载 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软 ...
- 网络采集软件核心技术剖析系列(5)---将任意博主的全部博文下载到内存中并通过Webbrower显示(将之前的内容综合到一起)
一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...
- 安装Hue后的一些功能的问题解决干货总结(博主推荐)
不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...
- python:爬取博主的所有文章的链接、标题和内容
以爬取我自己的博客为例:https://www.cnblogs.com/Mr-choa/ 1.获取所有的文章的链接: 博客文章总共占两页,比如打开第一页:https://www.cnblogs.com ...
- 【FreeRTOS实战汇总】小白博主的RTOS学习实战快速进阶之路(持续更新)
博主是个小白,打算把这段时间系统学习RTOS的文章统一整理到这里,另外本文会给出一些参考性资料和指导性建议: 本文宗旨 FreeRTOS 是由Richard Barry在2003年由设计的,由于其设计 ...
- 【STM32系列汇总】小白博主的STM32实战快速进阶之路(持续更新)
我把之前在学习和工作中使用STM32进行嵌入式开发的经验和教程等相关整理到这里,方便查阅学习,如果能帮助到您,请帮忙点个赞: 本文的宗旨 STM32 只是一个硬件平台,同样地他可以换成MSP430,N ...
随机推荐
- Linux yum的实现和配置
使用yum或dnf解决rpm包的依赖关系. YUM:Yellowdog Update Modifier.是rpm的前端程序 作用:解决软件包之间的依赖关系 yum工作原理: yum 服务器存放rpm包 ...
- mysql-安装(windows版本)与登录
安装mysql 1.MySQL版本 mysql-5.6.35-winx64.zip 2.首先解压到安装目录 3.修改配置文件 复制my-default.ini 重命名为my.ini 然后修改mysql ...
- idea 在创建maven时没有src的解决方法
在创建maven时 加上archetypeCatalog=internal
- 分布式事务(Seata) 四大模式详解
前言 在上一节中我们讲解了,关于分布式事务和seata的基本介绍和使用,感兴趣的小伙伴可以回顾一下<别再说你不知道分布式事务了!> 最后小农也说了,下期会带给大家关于Seata中关于sea ...
- 爬虫(6) - 网页数据解析(2) | BeautifulSoup4在爬虫中的使用
什么是Beautiful Soup库 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能 它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简 ...
- SELECT 的6大子句
SELECT 6大子句的顺序: SELECT selection_list /*要查询的列名称*/, 结果的字段列表 FROM table_list /*要查询的表名称*/, 后面跟表,视图,多行多列 ...
- 使用Docker搭建自己的Bitwarden密码管理服务
相信身为开发者,总会在各种网站中注册账号,为了方面记忆可以使用同一套账号密码进行注册,自从前段时间学习通时间撞库后有些人已经开始疯狂改密码了,可是密码一多就很难记忆,最好找个地方存储账户信息 我曾经使 ...
- 如何学习Vim
如果你是Linux用户,学习Vim会有很大的好处. 如果你是windows用户,个人建议还是使用vscode. 准备大约40min的学习时间,打开终端,输入下面命令开启自带教程 vimtutor 按操 ...
- 字符串运算符&&三元运算符
public class Demo01 { public static void main(String[] args) { //字符串连接符 + String int a=20; int b=10; ...
- HashTable集合和练习题_计算一个字符串中每一个字符出现的次数
HashTable集合 /** * java.util.Hashtable<K,V>集合 implement Map<K,V>接口 * Hashtable:底层也是一个哈希表, ...