之前一直都是在项目中,直接把jpush下载的资源直接放在主module,每次感觉需要配置的东西很多,有时候会担心缺少什么导致最后跑不通。

如果你是老手,每个人都各有各的风格习惯,相互学习的可以了解下

如果你是新手,个人觉得以下的集成方式应该会帮到你避免很多坑

极光推送官方文档

集成方式

1、jcenter 自动集成

2、手动集成

虽然现在支持了jcenter,相比手动少了很多,还是需要在gradle和AndroidManifest.xml中配置很多东西,有些时候可能会少写一些配置,导致最后失败

个人集成思路

既然需要集成这么多,为啥不写成一个module,把必要的lib、res、AndroidManifest.xml等等配置好,这样复用性也很强。如果开启一个新项目只需gradle引用一下就ok了。可能是习惯性,个人喜欢用手动集成的方式把他们写到module

jpush版本更新,你也只需替换对应的文件即可,轻轻松松解决

资源下载

1、官方Demo

2、应用快速集成Demo

获取方式:

可以新建应用,然后在“应用设置”——>“应用信息”——>“推送设置”,配置一下Android应用包名,这里也可以下载快速集成的Demo

3、个人Demo(一分钟快速集成使用)

jpush版本更新,可以直接下载官方Demo,进行资源替换,方便快捷

定义module(Jpush)

目录结构


这里就不一一说明了,这些大都是官方存在的,但是JPushSetUtil还是有必要说一下

JPushSetUtil

自定义的极光推送工具类,代码如下

/*** Description : JPush工具** @author WSoban* @date 2019/8/23*/
public class JPushSetUtil {private static JPushSetUtil sInstance;private int sequence = 1;private Context mContext;public static synchronized JPushSetUtil getInstance() {if (sInstance == null) {sInstance = new JPushSetUtil();}return sInstance;}/*** 在项目Application中做初始化** @param context*/public void init(Context context) {this.mContext = context;JPushInterface.setDebugMode(true);    // 设置开启日志,发布时请关闭日志JPushInterface.init(context);            // 初始化 JPush}/*** 获取RegistrationID** @return*/public String getRegistrationID() {return JPushInterface.getRegistrationID(mContext);}/*** 设置设备别名** @param alias*/public void setAlias(String alias) {onTagAliasAction(alias, true, TagAliasOperatorHelper.ACTION_SET);}/*** 设置设备标签** @param tags*/public void setTags(String tags) {onTagAliasAction(tags, false, TagAliasOperatorHelper.ACTION_SET);}/*** 删除别名** @param alias*/public void deleteAlias(String alias) {onTagAliasAction(alias, true, TagAliasOperatorHelper.ACTION_DELETE);}/*** 删除标签** @param tags*/public void deleteTags(String tags) {onTagAliasAction(tags, false, TagAliasOperatorHelper.ACTION_DELETE);}/*** 执行设置事件** @param aliasOrTags* @param isAliasAction* @param action*/private void onTagAliasAction(String aliasOrTags, boolean isAliasAction, int action) {TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean();if (isAliasAction) {tagAliasBean.alias = getAlias(aliasOrTags);} else {tagAliasBean.tags = getTags(aliasOrTags);}tagAliasBean.isAliasAction = isAliasAction;tagAliasBean.action = action;sequence++;TagAliasOperatorHelper.getInstance().handleAction(mContext, sequence, tagAliasBean);}/*** 检查别名格式** @param alias* @return*/private String getAlias(String alias) {if (TextUtils.isEmpty(alias)) {return null;}if (!ExampleUtil.isValidTagAndAlias(alias)) {return null;}return alias;}/*** 检查标签格式** @param tags* @return*/private Set<String> getTags(String tags) {if (TextUtils.isEmpty(tags)) {return null;}// "|"隔开的多个转换成 SetString[] sArray = tags.split("\\|");Set<String> tagSet = new LinkedHashSet<String>();for (String sTagItme : sArray) {if (!ExampleUtil.isValidTagAndAlias(sTagItme)) {return null;}tagSet.add(sTagItme);}if (tagSet.isEmpty()) {return null;}return tagSet;}/*** 设置推送服务开关** @param isOpenPush 是否开启推送*/public void setPushMessage(boolean isOpenPush) {if (isOpenPush) {//恢复推送服务JPushInterface.resumePush(mContext);} else {//停止推送服务JPushInterface.stopPush(mContext);}}/*** 用来检查推送服务是否已经被停止*/public boolean isPushStopped() {return JPushInterface.isPushStopped(mContext);}
}

AndroidManifest.xml

这里写了一些不会变的权限、service、provider、receiver,这样避免在主module中可能会遗漏

集成与使用

这里可以说是一分钟直接集成并使用,真不吹

gradle引用

dependencies {......api project(':jpush')
}

AndroidManifest.xml

只需替换JPUSH_APPKEY的value即可

 <!-- 推送发布KEY --><meta-dataandroid:name="JPUSH_CHANNEL"android:value="developer-default" /><meta-dataandroid:name="JPUSH_APPKEY"android:value="16b8215611e87e9cad95748d" /><receiverandroid:name=".JPushReceiver"android:enabled="true"android:exported="false"><intent-filter><action android:name="cn.jpush.android.intent.REGISTRATION" /> <!-- Required  用户注册SDK的intent --><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 --><category android:name="${applicationId}" /></intent-filter></receiver>

自定义Application

public class App extends Application {public static App mInstance;public App() {}public static App getInstance() {return mInstance;}@Overridepublic void onCreate() {super.onCreate();mInstance = this;JPushSetUtil.getInstance().init(this);}
}

自定义接收器

/*** 自定义接收器* <p>* 如果不定义这个 Receiver,则:* 1) 默认用户会打开主界面* 2) 接收不到自定义消息*/
public class JPushReceiver extends BroadcastReceiver {private static final String TAG = "JIGUANG-Example";// 打印所有的 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 if (key.equals(JPushInterface.EXTRA_EXTRA)) {if (TextUtils.isEmpty(bundle.getString(JPushInterface.EXTRA_EXTRA))) {Logger.i(TAG, "This message has no Extra data");continue;}try {JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA));Iterator<String> it = json.keys();while (it.hasNext()) {String myKey = it.next();sb.append("\nkey:" + key + ", value: [" +myKey + " - " + json.optString(myKey) + "]");}} catch (JSONException e) {Logger.e(TAG, "Get message extra JSON error!");}} else {sb.append("\nkey:" + key + ", value:" + bundle.getString(key));}}return sb.toString();}@Overridepublic void onReceive(Context context, Intent intent) {try {Bundle bundle = intent.getExtras();Logger.d(TAG, "[JPushReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);Logger.d(TAG, "[JPushReceiver] 接收Registration Id : " + regId);//send the Registration Id to your server...} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {Logger.d(TAG, "[JPushReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));processCustomMessage(context, bundle);} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {Logger.d(TAG, "[JPushReceiver] 接收到推送下来的通知");int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);Logger.d(TAG, "[JPushReceiver] 接收到推送下来的通知的ID: " + notifactionId);} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {Logger.d(TAG, "[JPushReceiver] 用户点击打开了通知");openNotification(context, bundle, Constant.SEND_NOTICE);} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {Logger.d(TAG, "[JPushReceiver] 用户收到到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);Logger.w(TAG, "[JPushReceiver]" + intent.getAction() + " connected state change to " + connected);} else {Logger.d(TAG, "[JPushReceiver] Unhandled intent - " + intent.getAction());}} catch (Exception e) {}}//send msg to MainActivityprivate 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 (extraJson.length() > 0) {msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras);}} catch (JSONException e) {}}LocalBroadcastManager.getInstance(context).sendBroadcast(msgIntent);}*/openNotification(context, bundle, Constant.SEND_MESSAGE);}/*** 点击通知,进行内部跳转** @param context* @param bundle*/private void openNotification(Context context, Bundle bundle, String notice) {Intent i = new Intent(context, MainActivity.class);i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);i.putExtra(Constant.KEY_TYPE, notice);i.putExtra(Constant.KEY_JPUSH, bundle);context.startActivity(i);}
}

获取RegistrationID

JPushSetUtil.getInstance().getRegistrationID()

一般app获取RegistrationID的会与后台的useid进行绑定,然后通过后台推送数据给移动端

开关推送服务

JPushSetUtil.getInstance().setPushMessage(boolean isOpenPush)
public void setPushMessage(boolean isOpenPush) {if (isOpenPush) {//恢复推送服务JPushInterface.resumePush(mContext);} else {//停止推送服务JPushInterface.stopPush(mContext);}}

如果接通推送之后,如果你停止推送服务,那么jpush是不会发送给你消息

平台上离线保留时长默认(1天),所以在时间范围内再恢复推送服务,它还是会把之前的通知或者信息发给你

示例

1、发送消息

2、发送通知

3、接收数据过程

step 1.在平台上发送信息在app上显示发送的数据

step 2.在平台上发送通知,点击通知,在app上显示发送的数据

step 3.停止推送服务,app没有收到通知

step 4.恢复推送服务,app重新收到刚刚没接收的通知

Android 一分钟快速使用极光推送相关推荐

  1. 极光推送 android 最新,Android——快速集成极光推送-Go语言中文社区

    集成极光推送 1,首先肯定是注册,添加应用 2,开始自动集成比手动集成简单第一步 在 build.gradle defaultConfig { multiDexEnabledtrue applicat ...

  2. android 如何集成小米和极光推送

    1.在小米和极光的官网平台的创建应用,获取到appkey. 极光创建后直接下载官方的Demo, 小米在官网上下载SDK:https://dev.mi.com/mipush/downpage/ 2.分别 ...

  3. 跨平台应用开发进阶(八) :uni-app 实现Android原生APP-云打包集成极光推送(JG-JPUSH)详细教程

    文章目录 一.前言 二.资源 三.集成 3.1 SDK 引入 3.2 代码集成 3.3 遇到的问题及解决方案 3.3.1 包大小限制 3.3.2 [JS Framework] 当前运行的基座不包含原生 ...

  4. 极光推送java demo_极光推送- 3 分钟 Demo - 极光文档

    3 分钟快速使用 JPush Android Demo 本文目的在于,指导新接触极光推送的开发者,在短短几分钟时间内把极光推送跑起来: 安装 Demo 客户端到手机 在 Portal 上推送通知 客户 ...

  5. Android第三方SDK集成 —— 极光推送

    前言: 本文前篇,可以帮助朋友们快速集成极光推送.本文后篇,是我自己项目实践的一些总结和心得,应该对读者们还是很有参考价值的,相信读完这篇文章,你会对极光推送有更加深入的理解,而不仅仅只是会集成而已. ...

  6. 三分钟帮你集成极光推送——和那些可能你不知道的事

    本文简介:本文前篇,可以帮助朋友们快速集成极光推送.本文后篇,是我自己项目实践的一些总结和心得,应该对读者们还是很有参考价值的,相信读完这篇文章,你会对极光推送有更加深入的理解,而不仅仅只是会集成而已 ...

  7. 极光推送 简书android,(Android)react-native集成极光推送

    在Android中使用reactnative集成极光推送步骤如下: (1)在AndroidManifest中声明网络权限,获取包名到极光推送官网添加应用,获取AppKey,该key需要注册到应用中以获 ...

  8. Android极光推送厂商离线通道集成文档及flutter集成总结

    <极光推送厂商离线通道集成文档> flutter集成指南 1.Android端配置 gradle配置 //极光推送def jpushVersion = '4.4.0'implementat ...

  9. Android使用XPush配置极光推送

    Android使用XPush配置极光推送 Android使用XPush配置极光推送 导入依赖 AndroidManifest.xml 创建自定义消息接收器CustomPushReceiver--对应A ...

最新文章

  1. 动态内存分配---数组
  2. 口罩能否反复使用?浸盐水后可100%让H1N1病毒灭活,但对其他病毒需谨慎 | 《科学报告》期刊...
  3. python标准模块--os
  4. 在不进入Guest OS的情况下,取得Guest OS的IP地址
  5. JAVA方法调用中的解析与分派
  6. 第 133 章 FAQ
  7. 再也不怕SVN冲突:轻松解决SVN冲突
  8. Python读取安卓手机GPS信息
  9. jQuery回调、递延对象总结(中篇) —— 神奇的then方法
  10. mysql排序区分大小写吗_MySQL的order by时区分大小写
  11. java http get 图片_http协议get方法获取图片并保存到本地
  12. pinterest类网站差异化发展 时光轴成稀饭网突围利器
  13. 显卡、GPU和CUDA的概念整理
  14. 一个小型VC项目的开发
  15. uilabel 自行撑开高度_textarea高度随内容自适应增高撑开
  16. 2020倒计时,大厂核心送给每一个脚踏实地努力着的Android程序员,逆风前行
  17. 显卡掉驱动 不用重启
  18. DIV+CSS网页设计常用布局代码
  19. matlab传感器避障小车,激光雷达避障小车的制作
  20. 2021年跨境品牌集体出海,2020年跨境电商数据报告分享

热门文章

  1. mysql405错误_mysql - 在框架内php调用某个方法, nginx 报 405错误 Status Code:405 Method Not Allowed...
  2. BC1.2协议之SDP
  3. Python pygame 坦克大战
  4. X-Space二级(三级)域名配置
  5. iOS开发——仿微信图片浏览交互的实现(向下拖拽图片退出图片浏览器)
  6. TortoiseGit小乌龟安装配置及使用
  7. 怎么把好几行弄成一行_怎么把excel表格里多行变成一行数据|excel表格中让多行内容变成为一行...
  8. 关于文件关联的图标不能正常显示
  9. 408 操作系统 操作系统概述
  10. HTML5在vivo手机适配问题