极光推送调研

极光接入

主要功能使用

总结

极光接入

申请极光AppKey

极光接入步骤/引入jar包

申请极光AppKey

进入极光官网,==申请开发者账号==,创建应用。并保存 ==AppKey==

AppKey:89326387481e57aa2cd576cb

极光接入步骤/引入jar包

添加项目配置依赖

在project中添加 ==jcenter== 库(Android Studio创建项目时候已经自动生成)

allprojects {

repositories {

jcenter()

}

}

repositories {

jcenter()

}

在app的build.gradle中添加相关配置

defaultConfig {

applicationId "com.xxx.xxx" //JPush 上注册的包名.

......

ndk {

//选择要添加的对应 cpu 类型的 .so 库。

abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'

// 还可以添加 'x86', 'x86_64', 'mips', 'mips64'

}

manifestPlaceholders = [

JPUSH_PKGNAME : applicationId,

JPUSH_APPKEY : "你的 Appkey ", //JPush 上注册的包名对应的 Appkey.

JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.

]

添加极光推送SDK依赖,

implementation 'cn.jiguang.sdk:jpush:3.1.6' // 此处以JPush 3.1.6 版本为例。

implementation 'cn.jiguang.sdk:jcore:1.2.5' // 此处以JCore 1.2.5 版本为例。

Manifests.xml中添加权限

android:name="com.jpushtest.click.jpushtest.permission.JPUSH_MESSAGE"

android:protectionLevel="signature" />

==注:== 使用极光推送还需要在Manifests.xml配置文件中添加相关的service、receiver等.此处先不配置,后续使用到再进行配置

目前极光的相关接入已经完成,下边进行使用.

主要功能的使用

初始化

自定义的通知栏

通知

自定义消息

初始化

在 ==Application==中添加JPush的初始化

JPushInterface.setDebugMode(true)

JPushInterface.init(application)

注:setDebugMode方法要在init之前

还需要在manifests.xml 配置文件配置相关的service、reciver.根据官方demo中要求的如下:

android:name="cn.jpush.android.ui.PopWinActivity"

android:theme="@style/MyDialogStyle"

android:exported="false">

android:name="cn.jpush.android.ui.PushActivity"

android:configChanges="orientation|keyboardHidden"

android:theme="@android:style/Theme.NoTitleBar"

android:exported="false">

android:name="cn.jpush.android.service.PushService"

android:process=":pushcore"

android:exported="false">

android:authorities="com.jpushtest.click.jpushtest.DataProvider"

android:name="cn.jpush.android.service.DataProvider"

android:process=":pushcore"

android:exported="false"

/>

android:name="cn.jpush.android.service.DaemonService"

android:enabled="true"

android:exported="true">

android:authorities="com.jpushtest.click.jpushtest.DownloadProvider"

android:name="cn.jpush.android.service.DownloadProvider"

android:exported="true"

/>

android:name="cn.jpush.android.service.PushReceiver"

android:enabled="true"

android:exported="false">

我们在接受通知、自定义的消息时候也要添加自定义的receiver,通过拦截不同的 ==action== 实现消息的接收

android:name="com.example.jpushdemo.MyReceiver"

android:exported="false"

android:enabled="true">

MyReceiver.java

接收JPush发送的广播,并做逻辑处理

public class MyReceiver extends BroadcastReceiver {

private static final String TAG = "JIGUANG-Example";

@Override

public void onReceive(Context context, Intent intent) {

try {

Bundle bundle = intent.getExtras();

Logger.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);

Logger.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);

//send the Registration Id to your server...

} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {

Logger.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));

processCustomMessage(context, bundle);

} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {

Logger.d(TAG, "[MyReceiver] 接收到推送下来的通知");

int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);

Logger.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);

} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {

Logger.d(TAG, "[MyReceiver] 用户点击打开了通知");

//打开自定义的Activity

Intent i = new Intent(context, TestActivity.class);

i.putExtras(bundle);

//i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );

context.startActivity(i);

} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {

Logger.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);

Logger.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);

} else {

Logger.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());

}

} catch (Exception e){

}

}

// 打印所有的 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 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.get(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 (extraJson.length() > 0) {

msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras);

}

} catch (JSONException e) {

}

}

LocalBroadcastManager.getInstance(context).sendBroadcast(msgIntent);

}

}

}

MyJPushMessageReceiver.java

自定义JPush message 接收器,包括操作tag/alias的结果返回(仅仅包含tag/alias新接口部分)

/**

* 自定义JPush message 接收器,包括操作tag/alias的结果返回(仅仅包含tag/alias新接口部分)

* */

public class MyJPushMessageReceiver extends JPushMessageReceiver {

@Override

public void onTagOperatorResult(Context context,JPushMessage jPushMessage) {

TagAliasOperatorHelper.getInstance().onTagOperatorResult(context,jPushMessage);

super.onTagOperatorResult(context, jPushMessage);

}

@Override

public void onCheckTagOperatorResult(Context context,JPushMessage jPushMessage){

TagAliasOperatorHelper.getInstance().onCheckTagOperatorResult(context,jPushMessage);

super.onCheckTagOperatorResult(context, jPushMessage);

}

@Override

public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {

TagAliasOperatorHelper.getInstance().onAliasOperatorResult(context,jPushMessage);

super.onAliasOperatorResult(context, jPushMessage);

}

@Override

public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) {

TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context,jPushMessage);

super.onMobileNumberOperatorResult(context, jPushMessage);

}

}

完成初始化之后,运行项目,根据log判断JPush是否启动

[MyReceiver] onReceive - cn.jpush.android.intent.CONNECTION, extras:

key:cn.jpush.android.APPKEY, value:89326387481e57aa2cd576cb

key:cn.jpush.android.CONNECTION_CHANGE, value:true

自定义的通知栏

JPush允许用户自定义通知栏的样式,并给样式进行编号(不同的场景使用不同的编号)

在完成JPush的init之后,使用 ==JPushInterface.setPushNotificationBuilder(2, builder1);== 初始化不同编号的通知栏样式 自定义不同的样式。

BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(this);

builder.statusBarDrawable = R.drawable.ic_launcher;

builder.notificationFlags = Notification.FLAG_AUTO_CANCEL

| Notification.FLAG_SHOW_LIGHTS; //设置为自动消失和呼吸灯闪烁

builder.notificationDefaults = Notification.DEFAULT_SOUND

| Notification.DEFAULT_VIBRATE

| Notification.DEFAULT_LIGHTS; // 设置为铃声、震动、呼吸灯闪烁都要

JPushInterface.setPushNotificationBuilder(1, builder);

MultiActionsNotificationBuilder builder1 = new MultiActionsNotificationBuilder(this);

//添加按钮,参数(按钮图片、按钮文字、扩展数据)

builder1.addJPushAction(R.drawable.jpush_ic_richpush_actionbar_back, "first", "my_extra1");

builder1.addJPushAction(R.drawable.jpush_ic_richpush_actionbar_back, "second", "my_extra2");

builder1.addJPushAction(R.drawable.jpush_ic_richpush_actionbar_back, "third", "my_extra3");

JPushInterface.setPushNotificationBuilder(2, builder1);

CustomPushNotificationBuilder builder3 = new

CustomPushNotificationBuilder(this,

R.layout.customer_notitfication_layout,

R.id.icon,

R.id.title,

R.id.text);

// 指定定制的 Notification Layout

builder3.statusBarDrawable = R.drawable.jpush_notification_icon;

// 指定最顶层状态栏小图标

builder3.layoutIconDrawable = R.drawable.ic_launcher;

// 指定下拉状态栏时显示的通知图标

JPushInterface.setPushNotificationBuilder(3, builder3);

JPush 控制台根据场景输入不同的数据

QQ截图20181015180120.png

通知

在控制台中点击通知->编辑通知->选择平台->点击发送

QQ截图20181015174842.png

发送成功之后即可看到在手机上已经接收到相关的推送通知.

也可在控制台中看到相关信息的输出。

[MyReceiver] onReceive - cn.jpush.android.intent.NOTIFICATION_RECEIVED, extras:

key:cn.jpush.android.ALERT, value:请问

key:cn.jpush.android.NOTIFICATION_ID, value:1621204763

key:cn.jpush.android.ALERT_TYPE, value:7

key:cn.jpush.android.NOTIFICATION_CONTENT_TITLE, value:JPush SDK Demo

key:cn.jpush.android.MSG_ID, value:1621204763

为了满足更多场景的客户需求,极光退出 ==标签== 、==别名== 功能,使用该功能需要在JPush初始化init之后的任意位置为当前用户增删改查标签、别名

switch (tagAliasBean.action) {

case ACTION_ADD:

JPushInterface.addTags(context, sequence, tagAliasBean.tags);

break;

case ACTION_SET:

JPushInterface.setTags(context, sequence, tagAliasBean.tags);

break;

case ACTION_DELETE:

JPushInterface.deleteTags(context, sequence, tagAliasBean.tags);

break;

case ACTION_CHECK:

//一次只能check一个tag

String tag = (String)tagAliasBean.tags.toArray()[0];

JPushInterface.checkTagBindState(context,sequence,tag);

break;

case ACTION_GET:

JPushInterface.getAllTags(context, sequence);

break;

case ACTION_CLEAN:

JPushInterface.cleanTags(context, sequence);

break;

default:

Logger.w(TAG,"unsupport tag action type");

return;

}

// 别名

switch (tagAliasBean.action){

case ACTION_GET:

JPushInterface.getAlias(context,sequence);

break;

case ACTION_DELETE:

JPushInterface.deleteAlias(context,sequence);

break;

case ACTION_SET:

JPushInterface.setAlias(context,sequence,tagAliasBean.alias);

break;

default:

Logger.w(TAG,"unsupport alias action type");

return;

}

添加完相关的别名、标签之后就可以在后台自定义批量的发送通知。

自定义的消息

自定义消息与通知的区别:

自定义消息用户是无感的。

JPush只负责接收到消息并将消息广播出去。不会在通知栏显示notification。开发者可以在控制台看到App接收到的相关消息。

发送自定义通知的步骤:

QQ截图20181015174306.png

接收自定义消息时候在 ==MyMyReceiver.java== 的 ==onReceive== 方法中拦截 ==JPushInterface.ACTION_MESSAGE_RECEIVED== 的action从Intent中接收到相关数据。根据需求自定义通知栏的显示,以及后续的逻辑操作。

总结

JPush采用长连接发送数据,内部SDK完成数据接收到以后的数据协议解析,并在APP中创建Notification。

android极光推送sequence,极光推送接入相关推荐

  1. Android开发之第三方推送JPush极光推送知识点详解 学会集成第三方SDK推送

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 下面是一些知识点介绍,后期将会带领大家进行代码实战: 一.Android实现推送方式解决方案: 1.推 ...

  2. Ionic3 Cordova Android 6.x集成最新极光华为/小米厂商通道推送

    Ionic3 Cordova Android 6.x集成最新极光华为/小米厂商推送 前置 一.集成华为厂商推送 1.在开放平台创建并配置应用 2.在安卓项目配置SDK 2.1. 添加配置文件 2.2. ...

  3. 友盟小米收不到推送消息_一个轻量级、可插拔的Android消息推送框架。一键集成推送(极光推送、友盟推送、华为、小米推送等)...

    XPush 一个轻量级.可插拔的Android消息推送框架.一键集成推送(极光推送.友盟推送.华为.小米推送等),提供有效的保活机制,支持推送的拓展,充分解耦推送和业务逻辑,解放你的双手! 在提iss ...

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

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

  5. 第一篇博客:极光推送以及自定义推送声音

    极光注册就不说了,首先配置App的build.grandle 在defaultConfig里粘贴一下内容appkey为我在极光注册之后的Appkey 然后配置AndroidManifest  把下面这 ...

  6. 极光IM使用教程-极光推送

    链接地址:http://jingyan.baidu.com/article/a948d65178a6ea0a2ccd2e7e.html 极光IM使用教程,如果您的 App 需要同时集成 Push 功能 ...

  7. 百度云推送、极光推送等云推送服务搜罗点评

    事先声明,本人只测试的android部分.ios的情况不知道. 个推 用户数量低于10000时免费,大于时收费.看很多大公司的软件都在用. "sdk接口比较丰富,使用比较简单,而且遇到问题直 ...

  8. 极光推送服务端API(定时推送任务,推送到指定设备,推送到所有设备)

    极光推送常用的几个api方法总结,抽取出了utils类,利用MsgType进行业务类型区别,方便app端收到推送后进行不同处理: 首先引入依赖: <!-- 极光推送 --><depe ...

  9. iOS 源生推送和极光推送

    公司新增推送服务器,要用源生,一两年前写过,不过最近几个项目是用极光,现在再整理一下,废屁不多放,看 源生推送和极光的区别: 1. 注册推送       这点一样,是极光推送进行加层封装了一下 2.获 ...

  10. BUI框架中 使用Jpush极光推送,单推跟群推,尽量让小白都能看懂

    1.先贴一下自己使用的Cordvoa版本 2.再贴一下自己使用的极光推送版本 3.极光推送GitHub地址:点击打开 4.小白常见问题 Crodova打包,编译出错. Crodova打包后,提示JPu ...

最新文章

  1. SSH框架整合(代码加文字解释)
  2. Maven一:maven的下载和环境安装以及创建简单的Maven项目
  3. Swift之本地国际化与App内切换语言
  4. Scala与Java差异(一)之基础语法
  5. Java验证(javafx)
  6. VMWARE VCSA 6.5安装过程
  7. PS教程第三课:PS界面
  8. 使用python中的networkx来生成一个图
  9. dubbo 自定义路由_爱奇艺在 Dubbo 生态下的微服务架构实践
  10. canvas 在其他画好的上面继续画_详解canvas绘制多张图的排列顺序问题
  11. 与缓存有关的http-header
  12. matlab电场线公式,matlab画电场线
  13. 教程:使用Java以编程方式将PLT转换为PDF或图像
  14. C盘用户名更改后一些注意事项
  15. 《岭南东见何君》——【古诗文复兴——故友重逢】
  16. mysql数据库设计与应用答案智慧树_知到智慧树MySQL数据库设计与应用完整免费答案...
  17. 对于Verilog语言的一些总结
  18. java 混淆war,java yguard混淆web工程
  19. 西南科技大学 计算机学院 张伟,信息工程学院综合测评公示第二稿-西南科技大学信息工程学院.DOC...
  20. 音乐API调用以及分析(以酷狗音乐为例)

热门文章

  1. redis-6.2.5集群部署手册
  2. adc网络语什么意思_王者荣耀游戏术语解释 ADC是什么意思
  3. 上传图片报Invalid filename错误
  4. java中bean是什么_java中bean是什么意思?
  5. 计算机无法添加无线网络,Win7电脑无法连接无线网络的原因和处理方法
  6. Ubuntu Screen recorder tool - Simple Screen Recorder
  7. 从苏宁电器到卡巴斯基第06篇:我在佳木斯的日子(中)
  8. 1419. Minimum Number of Frogs Croaking
  9. 【OCP学习1z0-053记录74】151 DBMS_TDB
  10. 使用谷歌(Google)TTS服务 – Java版开源gTTS及Python gTTS