要说学习极光推送,个人感觉官方文档就非常好啦,但是没法,人太懒啦,为了下次能够快速的将极光推送集成到项目中,故结合之前开发的项目和官方文档记录下简单的Android集成极光推送,在这之前,先上一张简单的思维导图吧,最近一直在研究思维导图,感觉帮助还挺大的。

 

 

先从官方文档中摘取出一些熟悉的名词,推送目标主要分为四种:

广播推送:向所有的注册用户发送一条广播消息

标签推送:根据属性对用户设置标签分组,向群组用户发送

别名推送:客户端绑定用户别名,向具体的单个用户推送

用户群体:根据JPush提供的多条件组合进行用户群组划分,实时筛选实时推送

推送的消息形式也分为四种:

通知:指在手机的通知栏(状态栏)上会显示的一条通知信息。通知主要用于提示用户的目的,应用于新闻内容、促销活动、产品信息、版本更新提醒、订单状态提醒等多种场景

自定义形式:自定义消息不是通知,所以不会被SDK展示到通知栏上。其内容完全由开发者自己定义。自定义消息主要用于应用的内部业务逻辑。一条自定义消息推送过来,有可能没有任何界面显示。

富媒体:JPush支持开发者发送图文并茂的通知,从而更好的传达信息,带来更丰富的用户互动。JPush提供了5种模板,开发者可以通过填充模板的内容,发送landing page、弹窗、信息流形式的富媒体通知。开发者还可以直接通过URL发送预先编辑好的页面。

本地通知本地通知API不依赖于网络,无网条件下依旧可以触发;本地通知的定时时间是自发送时算起的,不受中间关机等操作的影响。本地通知与网络推送的通知是相互独立的,不受保留最近通知条数上限的限制。本地通知适用于在特定时间发出的通知,如一些Todo和闹钟类的应用,在每周、每月固定时间提醒用户回到应用查看任务

集成极光推送主要有两种方式,一种是jcenter 自动集成,另外一种是手动集成,这里主要介绍下jcenter 自动集成,手动集成的可参考官方文档

 1:我们先在module的gradle中添加依赖

1  compile 'cn.jiguang.sdk:jpush:3.0.3'  // 此处以JPush 3.0.3 版本为例。
2  compile 'cn.jiguang.sdk:jcore:1.1.1'  // 此处以JCore 1.1.1 版本为例。

2:确认android studio的 Project 根目录的主 gradle 中配置了jcenter支持。(新建project默认配置就支持)

 1 buildscript {
 2     repositories {
 3         jcenter()
 4     }
 5     ......
 6 }
 7 
 8 allprojets {
 9     repositories {
10         jcenter()
11     }
12 }

3:在module的gradle中的defaultconfig添加AndroidManifest的替换变量

 1    ndk {
 2             //选择要添加的对应cpu类型的.so库。
 3             abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
 4             // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
 5         }
 6 
 7         manifestPlaceholders = [
 8                 JPUSH_PKGNAME: applicationId,
 9                 JPUSH_APPKEY : "4f44ddfa7aa983a7df72b5b3", //JPush上注册的包名对应的appkey.
10                 JPUSH_CHANNEL: "developer-default", //用户渠道统计的渠道名称
11         ]

4:在AndroidManifest中添加JPusService并配置android:process参数将PushService放在其他进程中:

 1  <!-- Required SDK 核心功能-->
 2         <!-- 可配置android:process参数将PushService放在其他进程中 -->
 3         <service
 4             android:name="cn.jpush.android.service.PushService"
 5             android:process=":pushcore"
 6             android:exported="false">
 7             <intent-filter>
 8                 <action android:name="cn.jpush.android.intent.REGISTER" />
 9                 <action android:name="cn.jpush.android.intent.REPORT" />
10                 <action android:name="cn.jpush.android.intent.PushService" />
11                 <action android:name="cn.jpush.android.intent.PUSH_TIME" />
12             </intent-filter>
13         </service>

至此,集成极光推送完毕,那我们怎么使用呢?其实你可以下一个官方的Demo JPushExample研究研究

1:首先我们要在Application中设置JPush调试模式和初始化SDK

 1 /**
 2  * Created by kebinran on 2017/7/20.
 3  */
 4 
 5 public class APP extends Application {
 6     @Override
 7     public void onCreate() {
 8         super.onCreate();
 9         //设置调试模式
10         JPushInterface.setDebugMode(true);
11         //init 初始化SDK
12         JPushInterface.init(this);
13     }
14 }

2:自定义的广播接收器并编写逻辑代码,你可以更快捷的从JPushExample中复制响应的代码在上面修改即可

  1 package com.example.kebinran.jpushdemo;
  2 
  3 import android.content.BroadcastReceiver;
  4 import android.content.Context;
  5 import android.content.Intent;
  6 import android.os.Bundle;
  7 import android.support.v4.content.LocalBroadcastManager;
  8 import android.text.TextUtils;
  9 
 10 import org.json.JSONException;
 11 import org.json.JSONObject;
 12 
 13 import java.util.Iterator;
 14 
 15 import cn.jpush.android.api.JPushInterface;
 16 
 17 /**
 18  * 自定义接收器
 19  * 
 20  * 如果不定义这个 Receiver,则:
 21  * 1) 默认用户会打开主界面
 22  * 2) 接收不到自定义消息
 23  */
 24 public class MyReceiver extends BroadcastReceiver {
 25     private static final String TAG = "JIGUANG-Example";
 26 
 27     @Override
 28     public void onReceive(Context context, Intent intent) {
 29         try {
 30             Bundle bundle = intent.getExtras();
 31             Logger.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));
 32 
 33             if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
 34                 String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
 35                 Logger.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
 36                 //send the Registration Id to your server...
 37 
 38             } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
 39                 Logger.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
 40                 processCustomMessage(context, bundle);
 41 
 42             } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
 43                 Logger.d(TAG, "[MyReceiver] 接收到推送下来的通知");
 44                 int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
 45                 Logger.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);
 46 
 47             } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
 48                 Logger.d(TAG, "[MyReceiver] 用户点击打开了通知");
 49 
 50                 //打开自定义的Activity
 51                 Intent i = new Intent(context, MainActivity.class);
 52                 i.putExtras(bundle);
 53                 //i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 54                 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
 55                 context.startActivity(i);
 56 
 57             } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
 58                 Logger.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
 59                 //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..
 60 
 61             } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
 62                 boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
 63                 Logger.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
 64             } else {
 65                 Logger.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
 66             }
 67         } catch (Exception e){
 68 
 69         }
 70 
 71     }
 72 
 73     // 打印所有的 intent extra 数据
 74     private static String printBundle(Bundle bundle) {
 75         StringBuilder sb = new StringBuilder();
 76         for (String key : bundle.keySet()) {
 77             if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
 78                 sb.append("\nkey:" + key + ", value:" + bundle.getInt(key));
 79             }else if(key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)){
 80                 sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key));
 81             } else if (key.equals(JPushInterface.EXTRA_EXTRA)) {
 82                 if (TextUtils.isEmpty(bundle.getString(JPushInterface.EXTRA_EXTRA))) {
 83                     Logger.i(TAG, "This message has no Extra data");
 84                     continue;
 85                 }
 86 
 87                 try {
 88                     JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA));
 89                     Iterator<String> it =  json.keys();
 90 
 91                     while (it.hasNext()) {
 92                         String myKey = it.next().toString();
 93                         sb.append("\nkey:" + key + ", value: [" +
 94                                 myKey + " - " +json.optString(myKey) + "]");
 95                     }
 96                 } catch (JSONException e) {
 97                     Logger.e(TAG, "Get message extra JSON error!");
 98                 }
 99 
100             } else {
101                 sb.append("\nkey:" + key + ", value:" + bundle.getString(key));
102             }
103         }
104         return sb.toString();
105     }
106     
107     //send msg to MainActivity
108     private void processCustomMessage(Context context, Bundle bundle) {
109         if (MainActivity.isForeground) {
110             String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
111             String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
112             Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION);
113             msgIntent.putExtra(MainActivity.KEY_MESSAGE, message);
114             if (!ExampleUtil.isEmpty(extras)) {
115                 try {
116                     JSONObject extraJson = new JSONObject(extras);
117                     if (extraJson.length() > 0) {
118                         msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras);
119                     }
120                 } catch (JSONException e) {
121 
122                 }
123 
124             }
125             LocalBroadcastManager.getInstance(context).sendBroadcast(msgIntent);
126         }
127 
128     }
129 }

别忘了在AndroidManifest中声明

 1   <!-- User defined.  For test only  用户自定义的广播接收器-->
 2         <receiver
 3             android:name=".MyReceiver"
 4             android:enabled="true"
 5             android:exported="false">
 6             <intent-filter>
 7                 <action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required  用户注册SDK的intent-->
 8                 <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required  用户接收SDK消息的intent-->
 9                 <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required  用户接收SDK通知栏信息的intent-->
10                 <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required  用户打开自定义通知栏的intent-->
11                 <action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收网络变化 连接/断开 since 1.6.3 -->
12                 <category android:name="com.example.kebinran.jpushdemo" />
13             </intent-filter>
14         </receiver>