极光推送开发(一)

2024-05-07 11:58
文章标签 开发 推送 极光

本文主要是介绍极光推送开发(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网上面关于极光推送的文章不多,再此写一篇文章进行说明。
极光推送的官方网站:https://www.jpush.cn/common/

(一)准备工作

在官方网站中,它已经对极光推送如何开发进行了详细的说明,照着上面的步骤是不难把极光推送应用到自己开发的客户端中的。
极光推送官方网站的说明文档链接: http://docs.jpush.io/guideline/android_guide/
点击打开如图所示:
这里写图片描述
在这里详细介绍了集成的步骤。

首先到资源下载处下载客户端SDK,本文主要讲解android开发,所以使用android 版 客户端sdk.
下载之后文档目录如图所示:
这里写图片描述
很明显,doc是说明文档,example是示例,libs是工具包,AnroidManifest.xml是示例配置文件,在该文件中详细配置了如何在应用中集成Jpush的配置方式。ChangeLog.txt是更新日志。

(二)注册

如有了以上的准备工作,可以着手开发了。不过首先要在Jpush官网注册,申请appkey。这个值至关重要,需要配置在AndroidManifest.xml中。如何注册就不多说了。

(三)开发
1、添加jar包和so动态库

援引jpush官网的步骤,如下:
复制 libs/jpush-sdk-release1.x.y.jar 到工程 libs/ 目录下
复制 libs/armeabi/libjpush.so 到工程 libs/armeabi 目录下
如果您的项目有 libs/armeabi-v7a 这个目录,请把 libjpush.so 也复制一份到这个目录。
具体效果如图:

这里写图片描述
如果在libs文件夹下面没有armeabi和armeabi-v7a这两个文件夹怎么办?好办,自己创建同名的文件夹就可以了哈哈~~然后在把jar和so动态库复制过来就可以了。

2、配置androidmainfest.xml文件

打开上面提到的AndroidManifest.xml示例,可以看到如下内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="您应用的包名"android:versionCode="172"android:versionName="1.7.2"><!--这里的versionCode versionName不是固定的,这里仅仅是示例,开发者根据自己的app设置--><uses-sdk android:minSdkVersion="7" android:targetSdkVersion="17" /><!-- Required 自定义用来收发消息的相关权限 -->               <permission
        android:name="您应用的包名.permission.JPUSH_MESSAGE"android:protectionLevel="signature" /><!-- Required  一些系统要求的权限,如访问网络等--><uses-permission android:name="您应用的包名.permission.JPUSH_MESSAGE" /><uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.VIBRATE" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>  <uses-permission android:name="android.permission.WRITE_SETTINGS" /><!-- Optional for location --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /><application
        android:icon="@drawable/ic_launcher"android:label="@string/app_name"><!-- Required SDK核心功能--><activity
            android:name="cn.jpush.android.ui.PushActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="orientation|keyboardHidden" ><intent-filter><action android:name="cn.jpush.android.ui.PushActivity" /><category android:name="android.intent.category.DEFAULT" /><category android:name="您应用的包名" /></intent-filter></activity><!-- Required  SDK核心功能--><service
            android:name="cn.jpush.android.service.DownloadService"android:enabled="true"android:exported="false" ></service><!-- Required SDK 核心功能--><service
            android:name="cn.jpush.android.service.PushService"android:enabled="true"android:exported="false"><intent-filter><action android:name="cn.jpush.android.intent.REGISTER" /><action android:name="cn.jpush.android.intent.REPORT" /><action android:name="cn.jpush.android.intent.PushService" /><action android:name="cn.jpush.android.intent.PUSH_TIME" /></intent-filter></service><!-- Required SDK核心功能--><receiver
            android:name="cn.jpush.android.service.PushReceiver"android:enabled="true" ><intent-filter android:priority="1000"><action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />   <!--Required  显示通知栏 --><category android:name="您应用的包名" /></intent-filter><intent-filter><action android:name="android.intent.action.USER_PRESENT" /><action android:name="android.net.conn.CONNECTIVITY_CHANGE" /></intent-filter><!-- Optional --><intent-filter><action android:name="android.intent.action.PACKAGE_ADDED" /><action android:name="android.intent.action.PACKAGE_REMOVED" /><data android:scheme="package" /></intent-filter></receiver><!-- Required SDK核心功能--><receiver android:name="cn.jpush.android.service.AlarmReceiver" /><!-- User defined.    用户自定义的广播接收器--><receiver
            android:name="您自己定义的Receiver"android:enabled="true"><!-- 这里是开发者自己定义的广播接收器,名字自己定--><intent-filter><action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required  用户注册SDK的intent--><action android:name="cn.jpush.android.intent.UNREGISTRATION" />  <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required  用户接收SDK消息的intent--><action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required  用户接收SDK通知栏信息的intent--><action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required  用户打开自定义通知栏的intent--><action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收网络变化 连接/断开 since 1.6.3 说明这个功能是从1.6.3版本才开始有的,之前所用的版本是获取不到连接状态的变化的,我目前所用的版本是1.7.2,所以可以获取连接状态的变化的 --><category android:name="您应用的包名" /></intent-filter></receiver><!-- Required  . Enable it you can get statistics data with channel --><meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/><meta-data android:name="JPUSH_APPKEY" android:value="您的Appkey" /> <!--  </>值来自开发者平台取得的AppKey--></application>
</manifest>

上面配置文件中详细说明了如何进行配置,”您的Appkey” “您应用的包名” “您自己定义的Receiver” 出现这三个字段的地方均需要开发者根据自己的应用进行响应的替换。”Required”标识的地方是必须要在配置文件中配置的。
上面配置好之后,就可以码代码了。

3、开发自定义广播接收器

配置文件中有一个广播接收器,什么作用呢?主要就是接收极光推送服务器发送的广播。
http://docs.jpush.io/client/android_api/这个链接是激光推送的客户端pai.在这里详细介绍了激光推送给客户端所提供的功能。
这里写图片描述
其中的接收推送消息的Receiver至关重要。
这里写图片描述
这个是极光推送官网对于这个Receiver的功能的定义。如果开发者不进行这个广播接收的定义,它的功能是固定的。当开发者对于该广播接收者进行定义它的功能就很灵活了。当接收到推送推送的消息之后,让客户端如何进行响应,完全由开发者自己决定。
至于这个Receiver的配置已经固定,开发者只需要实现功能即可。

自定义的Receiver的代码如下:

/*** 自定义接收器* 如果不定义这个 Receiver,则:* 1) 默认用户会打开主界面* 2) 接收不到自定义消息*/
public class MyReceiver extends BroadcastReceiver {private static final String TAG = "JPush";@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();Log.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {Log.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));processCustomMessage(context, bundle);} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {Log.d(TAG, "[MyReceiver] 接收到推送下来的通知");int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);Log.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {Log.d(TAG, "[MyReceiver] 用户点击打开了通知");//打开自定义的Activity,当然这个并不是强制要求的,当用户点击推送消息是,可以不做处理的Intent i = new Intent(context, TestActivity.class);i.putExtras(bundle);i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );context.startActivity(i);} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {Log.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));//在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..} else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);Log.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);//这个获取的是当前登录用户的连接状态。这里的连接状态是指用户与Jpush推送服务器的连接状态。} else {Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());}}// 打印所有的 intent extra 数据 这里只是打印获取的数据的方法private static String printBundle(Bundle bundle) {StringBuilder sb = new StringBuilder();for (String key : bundle.keySet()) {if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {sb.append("\nkey:" + key + ", value:" + bundle.getInt(key));}else if(key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)){sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key));} else {sb.append("\nkey:" + key + ", value:" + bundle.getString(key));}}return sb.toString();}/***send msg to MainActivity*这个方法是获取到推送的消息之后再次发送广播到其他的广播接收器当中,*目的就是传递获取的广播数据,进行相应的处理,实现相应的功能,开发者在这里*完全可以自己实现自己想要的功能。不一定非要使用这种方式。**/private void processCustomMessage(Context context, Bundle bundle) {if (MainActivity.isForeground) {String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION);msgIntent.putExtra(MainActivity.KEY_MESSAGE, message);if (!ExampleUtil.isEmpty(extras)) {try {JSONObject extraJson = new JSONObject(extras);if (null != extraJson && extraJson.length() > 0) {msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras);}} catch (JSONException e) {}}context.sendBroadcast(msgIntent);//发送广播}}
}

自定义Receiver中含有非常丰富的消息类型,这些消息类型开发者都可以在Android SDK API中了解到每种类型的作用、字段类型、功能等。这里提供的消息类型已经基本满足开发者的需求了。

内容比较长,我分两个博文来写,下面的内容请参考下一篇博文。

这篇关于极光推送开发(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967287

相关文章

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10