我想是因为我这个标题取得不好吧。。。什么哀怨情仇,第一次保存就没保存好,整个下午的努力全部都泡紫菜蛋汤去了然后就真的有哀怨情仇了,后面又花了一个下午再把它补齐了,点击保存编辑的那一刻,心扑通扑通跳,还好他现在对我只有情没有仇了,终于保存成功了

##写在前面
极光推送这么好的东西,简单几步就能集成推送的牛逼闪闪的功能,今天我就来说说怎么从0到1来集成极光推送。PS:今天刚看了Markdown语法的神奇功效,怎么能不好好来一发--->那么拿起键盘搞起吧~
###step1 创建HelloJpush

我们界面就这样吧~从官方那边做一个推送一个消息过来,这边收到信息的话就显示出来,也可以做通知栏消息,界面就这样先

###step2 Jpush主页上面创建应用
当然没有账号的。。。什么你没有账号?

好吧好吧,既然是从0到1那我们就去搞个账号=> 地址戳我

我真发现这注册页面美美哒,不信你看

注册也是简单到没啥了,那你就按着这个顺序一步步填下去,我就不手把手教你填信息啦


step3 项目集成

注册完不知道从何下手,唯一参考依据就是文档开起来啦~~

==>听说你找我??

#####项目集成1 添加应用
好奇宝宝的你打开是不是就点进去3分钟集成Demo啦

没错就想看看她的庐山真面目,一进来他就教我们怎么创建应用啦~

应用管理这边新建一个应用

填入应用名再选一个美美哒的图标上传进去,再填入我们大安卓的包名就可以啦,点击就会新建一个应用

我这边的就是酱紫啦~appkey是个重要的东东,待会会用到

#####项目集成2 添加jar包和so库
看项目集成指南,里面有两种集成方法
使用AndroidStudio的童鞋可以使用jcenter的自动集成步骤,复制黏贴代码~~

                   好的~~本集完~~

话说酱紫我整篇就没啥内容啦EC的童鞋表示WTF

好啦好啦,那我们就自己动手来搞一搞,不用jcenter

首先去下载官方给的jar包===>召唤神龙

下载完解压缩拿到lib里面的jar包和各版本的so库

然后打开将jar库放到libs目录下,建议 将so库放在jniLibs目录下
一般直接建一个应用是木有jniLibs库的,我是这么给它创建的

在src/main目录下与java同级的目录新建一个jniLibs文件夹,返回到AS目录里面就能看到jniLibs目录,将所有的so库连同它的文件夹考到jniLibs目录下

这样做的好处是你不需要在gradle里面额外配置so库的路径,不然就得这么干,在android{}节点下配置

    sourceSets{
    main{
     jniLibs.srcDirs=['libs']
           }
     }

基础库配置完顺便配置以下混淆,一般企业级项目都会配置混淆,我们的原则也是每添加一个库就配置对应的混淆,不然等整个项目都结束了才来配置混淆你不知道自己都添加了哪些,哪些应该配置混淆,不要问我是怎么知道的。。。。。

-dontoptimize
-dontpreverify
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }

使用了Gson顺便配置下Gson

#==================gson && protobuf==========================
-dontwarn com.google.**
-keep class com.google.gson.** {*;}
-keep class com.google.protobuf.** {*;}

#####项目集成3 清单文件的配置

清单文件的配置分三块


  • 权限的配置
    权限要配置以下几项(Require为必须)
    <!-- Required -->
    <uses-permission android:name="${applicationId}.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.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- Optional. Required for location feature -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <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" />
    <uses-permission android:name="android.permission.GET_TASKS" />



  • 一些Service和Reciver的配置
    <!-- Required SDK 核心功能-->
          <!-- 可配置android:process参数将PushService放在其他进程中 -->
          <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>
          <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
          <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
          <service
              android:name="cn.jpush.android.service.DaemonService"
              android:enabled="true"
              android:exported="true">
              <intent-filter >
                  <action android:name="cn.jpush.android.intent.DaemonService" />
                  <category android:name="${applicationId}"/>
              </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" />
                  <category android:name="${applicationId}"/>
              </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核心功能-->
          <activity
              android:name="cn.jpush.android.ui.PushActivity"
              android:configChanges="orientation|keyboardHidden"
              android:theme="@android:style/Theme.NoTitleBar"
              android:exported="false" >
              <intent-filter>
                  <action android:name="cn.jpush.android.ui.PushActivity" />
                  <category android:name="android.intent.category.DEFAULT" />
                  <category android:name="${applicationId}" />
              </intent-filter>
          </activity>
          <!-- Required SDK核心功能-->
          <service
              android:name="cn.jpush.android.service.DownloadService"
              android:enabled="true"
              android:exported="false" >
          </service>
          <!-- Required SDK核心功能-->
          <receiver android:name="cn.jpush.android.service.AlarmReceiver" />
          <!-- User defined. 用户自定义的广播接收器-->
          <receiver
              android:name=".youReceiver"
              android:enabled="true">
              <intent-filter>
                  <!--Required 用户注册SDK的intent-->
                  <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 用户打开自定义通知栏的intent-->
                  <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
                  <!-- 接收网络变化 连接/断开 since 1.6.3 -->
                  <action android:name="cn.jpush.android.intent.CONNECTION" />
                  <category android:name="${applicationId}" />
              </intent-filter>
          </receiver>



  • appkey的配置
    <!-- Required. For publish channel feature -->
          <!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。-->
          <!-- 例如: -->
          <!-- 发到 Google Play 的APK可以设置为 google-play; -->
          <!-- 发到其他市场的 APK 可以设置为 xxx-market。 -->
          <!-- 目前这个渠道统计功能的报表还未开放。-->
          <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
          <!-- Required. AppKey copied from Portal -->
          <meta-data android:name="JPUSH_APPKEY" android:value="youkey"/>

一些注意的事项
以上Require的均是必须,Optional为可选的

有一个特别注意下

这个用户自定义的广播一般也是一定要配置的,用来接收服务端的推送,然后根据推送类型,app内部做相应的操作相应

这个需要用户自定义,怎么做呢
先新建一个类,继承BrocastReceiver,重新onReceiver方法,

public class MyJpush extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        intent.setAction("jpush");
        //此处就是推送过来的消息接收到的地方
        Bundle bundle = intent.getExtras();
        String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);

    }
}

此处就是当收到服务端推送的消息时这边就会做出相应,我们就可以根据消息类型进行相对应的操作

然后把这个Receiver配置到清单文件的用户自定义的Receiver下

<receiver
android:name=".MyPush"
android:enabled="true">
<intent-filter>
<!--Required 用户注册SDK的intent-->
<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 用户打开自定义通知栏的intent-->
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
<!-- 接收网络变化 连接/断开 since 1.6.3 -->
<action android:name="cn.jpush.android.intent.CONNECTION" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>

#####项目集成4 初始化JPush
配置完清单文件就开始初始化推送了
官方文档说

所以一切从JPushInterface开始

init在整个项目里面只需要调用一次,全局有效,所以我们能想到的就是Application了,自定义一个App集成Application,在onCreat方法里面进行初始化

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        JPushInterface.init(this);
        JPushInterface.setDebugMode(true);
      }
    }

然后将它配置到清单文件的Application的name属性里

然后,运行看看??

首次初始化,log日志为info级别的会输出初始化成功,并返回appkey~由于我这个已经不是第一次初始化了,就截不了图了

#####项目集成5 开始推送了
那我们就去推个消息过来看看??

当然不行,推送成功我们并没有对推送消息做任何处理,即使成功了我们也并不知道,所以呢,就要对我们自定义的Receiver做处理了
刚才我们已经自定义了一个MyJPush,并且配置到清单文件里了,我们要处理的对象就是MyJPush的onReceiver里面,那怎么处理呢?

文档文档你在哪??

就是它了,一切从intent下手,intent的bundle里面藏了我们所需要的消息,一般我们项目里的做法就是通过拿到消息里面内容进行解析,根据解析得到的内容再指定app做什么操作,推送的消息看大伙的服务端的小伙伴怎么做的了,我们这边就做一个消息的演示,至于比如推送JSon这个高级的东东就留给大伙自己去玩啦。

那我们来玩一下,我们就从JPush的官方推送一个自定义消息过来,app获取到消息后就显示到主页面上面

那在自定义Receiver(我的项目是MyJpush)的onReceiver方法里面拿到message并且发送个广播让主页面的MainActivity接收到然后显示

 Bundle bundle = intent.getExtras();
        String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
        if (!TextUtils.isEmpty(message)){
            Log.e("MyJpush", "message = " + message);
            Intent intent1 = new Intent("jpush");
            intent1.putExtra("message",message);
            context.sendBroadcast(intent1);
        }

在MainActivity的onCreate方法里面

registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String message = intent.getStringExtra("message");
                tvResult.setText(message);
            }
        }, new IntentFilter("jpush"));

玩起来~

是不是有人会问我为什么你不直接让MainActivity继承BrocastReceive,重写OnReceiver,把这个MainActivity配置到清单文件里面不就好了??
当然可以,这对我们一个示例来说简单易实现,可是我们一般的项目中都不建议这么做,因为要处理的业务逻辑千千万,所以我这边也是写一个通用的方法,让大家看着也顺眼一些

JPush进阶 使用alia做个别推送

就是这个,使用它可以针对个别用户做推送,一般我们项目中呢就使用用户的id做别名就好了,我们自己的简单示例木有id,所以我们就自己定义一个字符串当别名好了。

设置别名的方法是JPushInterfaced的setAlias,我们调用此方法做一个别名的设置

  JPushInterface.setAlias(this, "alia1", new TagAliasCallback() {
            @Override
            public void gotResult(int i, String s, Set<String> set) {
                if (i == 0) {
                    //设置成功
                }
            }
        });

注意 要返回的code==0才算设置成功,

如果不成功怎么办呢?===>找我找我

那我们再来试一下??

左边设置的alia=“alia1”,右边设置的alia = “alia2”,极光推送推起来~~

设置别名就

别名不存在的话是推送不出去的,当然要客户端别名设置成功了这边才会有这个别名,否则别名是不存在的

左边的有显示,右边没动静

再来一个

左边没变,右边收到消息了~~





好吧,那就这样子了~~
##总结

总结下整个过程

  • 注册账号,并且在JPush后台创建应用
  • 配置环境可以使用jcenter自动配置,也可以使用手动配置
  • 手动配置需要下载jar包和so库进行配置,注意so库的文件放置路径
  • 配置清单文件,先配置权限,然后配置service和receiver,最后配置appkey
  • 自定义Receiver,继承 BroadcastReceiver并重写onReceiver方法,此方法在接收到消息会会有响应
  • 初始化Jpush,在App里面操作
  • 拿出推送来的消息,显示到页面

#完