极光征文 | 我与极光推送在一起的第二年
背景
我是在两年前认识极光,没错是通过老师认识的,极光给了我第一个印象"推送",导致现在极光推送四个字已经成了一个领域的代名词。就和提起当当网 第一个印象就是"书城"一样,除了推送做的好以外,极光的IM、统计、短信认证等等我都在用。这篇文章主要分享一下我与极光的故事、并且分享android端集成推送的步骤。
当时在学校的时候,老师为了培养我们自己在网上查阅资料自学一些三方sdk的使用,例如:地图、统计、推送、等等以后项目会经常用到的一些知识。印象最深的就是"极光推送",因为极光是我接触的第一个三方的平台。参加工作之后推送一直在用极光的服务,比想象中的还易集成、效率高。
功能说明
极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度、提高应用的留存率。极光推送客户端支持 Android,iOS 两个平台。
本 Android SDK 方便开发者基于 JPush 来快捷地为 Android App 增加推送功能。
主要功能
- 保持与服务器的长连接,以便消息能够即时推送到达客户端
- 接收通知与自定义消息,并向开发者 App 传递相关信息
主要特点
- 客户端维持连接占用资源少、耗电低
- SDK 丰富的接口,可定制通知栏提示样式
- 服务器大容量、稳定
步骤
第一步:创建应用
- 首先去官网 极光官网注册账号并且创建应用。
创建完成之后拿到AppKey,没错这个AppKey就是让你创建好的应用,通过一些配置信息和你Studio上的project关联上。我的是: AppKey ee1deb569254b851888ed8fa
之后继续跟进推送设置。点击完成推送设置之后会设置包名
image.png
例如:我创建好的项目包名是 如下图: 点击保存之后应用就已经设置好了。接下来进行项目配置。
image.png
第二步:项目配置
1.首先去官网下载好极光的sdk下载页
2.下载成功后将Jpush-android-3.x.x-release.zip压缩包的内容解压如下图所示目录结构
3.打开下载好的包。如下图
我们需要做的就是把目录libs文件夹下的复制到我们的project中,接下来按照文档中的自动集成方式进行操作
image.png
- 确认 android studio 的 Project 根目录的主 gradle 中配置了 jcenter 支持。(新建 project 默认配置就支持)
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
-
在 module 的 gradle 中添加依赖和 AndroidManifest 的替换变量。这时候就用到了我们应用上的appkey
defaultConfig { applicationId "com.example.mac.myfirstapp"//JPush 上注册的包名. minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" ndk { //选择要添加的对应 cpu 类型的 .so 库。 abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a' // 还可以添加 'x86', 'x86_64', 'mips', 'mips64' } manifestPlaceholders = [ JPUSH_PKGNAME : applicationId, JPUSH_APPKEY : "ee1deb569254b851888ed8fa", //JPush 上注册的包名对应的 Appkey. JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可. ] } dependencies { ..... implementation 'cn.jiguang.sdk:jpush:3.1.6' // 此处以JPush 3.1.6 版本为例。 implementation 'cn.jiguang.sdk:jcore:1.2.5' // 此处以JCore 1.2.5 版本为例。 }
-
根据文档上提示: 如果在添加以上 abiFilter 配置之后 android Studio 出现以下提示:
NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin
则在 Project 根目录的 gradle.properties 文件中添加:
android.useDeprecatedNdk=true
-
到现在项目就已经成功集成极光推送了。我们可以在极光平台上模拟一下推送信息。
image.png
进行到这里通知就已经完全可以收到了,但是如果要和后台交互的话,这样是完全不够的,需要我们自定义广播,还需要绑定设备id也就是RegistrationID,而这个id是怎么拿到的呢?文档已经给我们自定义好了Receiver参考:
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
private NotificationManager nm;
@Override
public void onReceive(Context context, Intent intent) {
String content=intent.getStringExtra("msgContent");
Bundle bundle=intent.getExtras();
regId = JPushInterface.getRegistrationID(context);
// SharedPreferencesUtils.
Log.e(TAG, "广播的id " + regId);
SharedPreferencesUtils.saveString(context, "regId", regId);
if (null == nm) {
nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
}
Bundle bundle = intent.getExtras();
Logger.d(TAG, "onReceive - " + intent.getAction() + ", extras: " + AndroidUtil.printBundle(bundle));
if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
Logger.d(TAG, "JPush 用户注册成功");
} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
Logger.d(TAG, "接受到推送下来的自定义消息");
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
Logger.d(TAG, "接受到推送下来的通知");
receivingNotification(context,bundle);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
Logger.d(TAG, "用户点击打开了通知");
openNotification(context,bundle);
} else {
Logger.d(TAG, "Unhandled intent - " + intent.getAction());
}
}
private void receivingNotification(Context context, Bundle bundle){
String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
Logger.d(TAG, " title : " + title);
String message = bundle.getString(JPushInterface.EXTRA_ALERT);
Logger.d(TAG, "message : " + message);
String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
Logger.d(TAG, "extras : " + extras);
}
private void openNotification(Context context, Bundle bundle){
String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
String myValue = "";
try {
JSONObject extrasJson = new JSONObject(extras);
myValue = extrasJson.optString("myKey");
} catch (Exception e) {
Logger.w(TAG, "Unexpected: extras is not a valid json", e);
return;
}
if (TYPE_THIS.equals(myValue)) {
Intent mIntent = new Intent(context, ThisActivity.class);
mIntent.putExtras(bundle);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);
} else if (TYPE_ANOTHER.equals(myValue)){
Intent mIntent = new Intent(context, AnotherActivity.class);
mIntent.putExtras(bundle);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);
}
}
}
完结
到这里其实已经就算完工了,app端集成起来还是蛮简单的,如果有需要还可以继续完成自定义消息、通知样式、等等。这里也只是简单的介绍一下极光推送的使用步骤,如果开发者有进一步的了解的话还需要多看一下文档,或者移步至极光社区,今天写这个文章一是为了参加活动 二是记录一下脚印。希望一年之后的自己在看到这篇文章的时候能说一句"好菜 真的好菜啊哈哈~~" 进步的标志~ 如果有不足的地方还请更正一下 3q~
另外祝认真看完这篇文章的人 新年快乐 啊哈哈。
「本文为极光征文参赛文章」