Android 中使用极光推送消息详细介绍

简介

在Android开发中,服务器有时候会向客户端推送一些用户可能感兴趣的消息,比如:淘宝,网易新闻,美团等都会向我们客户端推送消息.今天我就介绍一个第三方免费推送消息的服务:极光推送

官方资源

官方文档: 
http://docs.jiguang.cn/client/android_sdk/ 
3 分钟快速集成 JPush Android SDK: 
http://docs.jiguang.cn/guideline/android_3m/ 
Android SDK集成: 
http://docs.jiguang.cn/guideline/android_guide/

具体使用

效果

官方提供了Demo ,在3分钟快速集成SDK文档里面,可以下载,如果不了解极光推送,可以吧官方的Demo下载下来运行一遍,就可以看见效果了 
这边我已经下来过了,所以我就直接把效果图贴出来,方便大家观看 
这里写图片描述
在极光推送的后台输入:JPushTest后,点击发送,客户端这便就会受到通知,这只是一个简单的效果

实现

好了,看完效果之后,我们就一步一步实现这个效果把

注册账号拿到AppKey

第一步就是要去官网注册账号,之后点击开发者服务选极光推送 
这里写图片描述
第二步就是点击立即使用 
这里写图片描述
第三步 创建应用 
这里写图片描述
第四步 填写应用信息 
这里写图片描述
第五步 拿到AppKey 
这里写图片描述

新建一个工程

把刚才下载好的SDK解压出来 
这里写图片描述 
打开libs文件夹 
这里写图片描述 
其中有两部分,把jpush-android-2.1.7.jar这个jar包复制到我们工程的libs下面,之后在app/src/main文件夹下面新建一个文件夹,叫:jniLibs,把刚才除了jpush-android-2.1.7.jar这个以外所有的文件夹都放到这里 
这里写图片描述

然后找到我们的manifest.xml 修改其中的内容(我已经把必须的都复制过来了,可以直接复制我的代码,当然也可以去照着文档进行复制,推荐去照着官方文档进行修改)

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.hfs.jpushexample"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <permission
        android:name="${applicationId}.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature"/>

    <!-- 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.WRITE_SETTINGS"/>
    <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.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>


    <!-- Optional for location -->
    <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"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".TestActivity"/>
        <!-- Required SDK核心功能-->
        <activity
            android:name="cn.jpush.android.ui.PushActivity"
            android:configChanges="orientation|keyboardHidden"
            android:exported="false"
            android:theme="@android:style/Theme.NoTitleBar">
            <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 核心功能-->
        <!-- 可配置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"
            android:exported="false">
            <intent-filter android:priority="1000">
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/>   <!--Required  显示通知栏 -->
                <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核心功能-->
        <receiver
            android:name="cn.jpush.android.service.AlarmReceiver"
            android:exported="false"/>

        <!-- User defined.  For test only  用户自定义的广播接收器-->
        <receiver
            android:name=".MyReceiver"
            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.UNREGISTRATION"/>
                <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.ACTION_RICHPUSH_CALLBACK"/> <!--Optional 用户接受Rich Push Javascript 回调函数的intent-->
                <action android:name="cn.jpush.android.intent.CONNECTION"/><!-- 接收网络变化 连接/断开 since 1.6.3 -->
                <category android:name="${applicationId}"/>
            </intent-filter>
        </receiver>


        <!-- Required  . Enable it you can get statistics data with channel -->
        <meta-data
            android:name="JPUSH_CHANNEL"
            android:value="developer-default"/>
        <meta-data
            android:name="JPUSH_APPKEY"
            android:value="665d69121981502b7929625c"/> <!--  </>值来自开发者平台取得的AppKey-->
    </application>

</manifest>

好了,manifest.xml配置完之后,其实代码很简单,两句代码就可以实现推送功能了

在MainActivity的onCreate方法中加入这两句代码:

 JPushInterface.setDebugMode(true);//如果时正式版就改成false
 JPushInterface.init(this);

这样,最基本的功能完成了,我们看下效果 
这里写图片描述

修改通知标题

极光推送默认的通知标题是我们在创建应用时输入的应用名字,这有时不符合我们的要求,所以我们就要自己设置标题了,那么怎么设置呢? 
极光推送已经为我们考虑到了这个问题了,我们只要在推送时输入我们要推送的标题即可,在立即发送上面有一个可选设置,打开就可以自定义标题了 
这里写图片描述

这回我们修改下标题,再看下效果 
这里写图片描述

发送消息

这个发送消息和上面的发送通知还是有区别的.发送通知可以直接展示在客户端上,但是发送消息客户端那边虽然接收到了,但是并不显示(不明觉厉???看下效果) 
我在后台发送一个消息,我们观察下模拟器的变化 
这里写图片描述

好吧,模拟器什么都没有…. 
那怎么知道我们发送成功呢? 
我们可以看Log啊(哈哈),打开AndroidStudio看下log日志

07-30 12:33:00.917 19470-19470/com.example.hfs.jpushexample I/System.out: 收到了通知
07-30 12:36:45.621 19470-19493/com.example.hfs.jpushexample D/JPush: [NetworkingClient] Received bytes - len:157, connection:-1205476664, pkg:com.example.hfs.jpushexample
07-30 12:36:45.621 19470-19493/com.example.hfs.jpushexample D/JPush: [NetworkingClient] Action - receivedCommand - cmd:3
07-30 12:36:45.621 19470-19493/com.example.hfs.jpushexample D/JPush: [NetworkingClient] Network listening...
07-30 12:36:45.621 19470-19470/com.example.hfs.jpushexample D/MyReceiver: onReceive - cn.jpush.android.intent.MESSAGE_RECEIVED
07-30 12:36:45.621 19470-19470/com.example.hfs.jpushexample I/System.out: 收到了自定义消息。消息内容是:JpushMessage

这回看到了吧

那么问题来了,这个推送消息有什么用呢? 
那就解释下把: 
自定义消息是极光推送自己的概念。 
自定义消息不是通知,所以不会被SDK展示到通知栏上。其内容完全由开发者自己定义。 
自定义消息主要用于应用的内部业务逻辑。一条自定义消息推送过来,有可能没有任何界面显示。

发送消息或通知到特定的人群

有时我们并不是想把内容都发送给所有的用户,比如有的用户喜欢玩游戏,我们就把跟游戏有关的内容推送给他们即可,那么怎么实现呢? 
在推送对象里面有个目标人群,在那里我们可以选择我们要推送的目标人群 
这里写图片描述

Registration ID

这个是只要有客户端使用,极光推送就会生成一个Registration ID 因为这个时极光推送生成的,我们用起来不是很方便,所以基本上不用

别名

之后再看设备别名,这个就是你可以为客户端设置别名,这样在你推送的时候,你就推送到和你设置别名匹配的客户端上,使用直接调用setAlias()方法即可(比如用户登录完,你可以把用户名作为该用户的别名)

举例:

package com.example.hfs.jpushexample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.HashSet;
import java.util.Set;

import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        JPushInterface.setDebugMode(true);
        JPushInterface.init(this);

        JPushInterface.setAlias(this, //上下文对象
        "test123456", //别名
        new TagAliasCallback() {//回调接口,i=0表示成功,其它设置失败
            @Override
            public void gotResult(int i, String s, Set<String> set) {
                Log.d("alias", "set alias result is" + i);
            }
        });
    }
}

好了,我们运行下程序,再看下效果 
这里写图片描述

######标签(TAG) 
这个和上面别名区别在于,这个可以发送好多个客户端,只要匹配这个标签即可 
这里为了实现这个功能,我这边开两个模拟器,方便大家看下效果

方法是调用setTag()这个方法

说下这个方法把,这个方法的第二个参数是个set集合,为什么呢?因为每个人可能有好多个兴趣爱好,这样就可能有多个标签.这里我们假设第一个用户的TAG是sport和game;第二个用户的TAG是music和game

package com.example.hfs.jpushexample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.HashSet;
import java.util.Set;

import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        JPushInterface.setDebugMode(true);
        JPushInterface.init(this);

//        JPushInterface.setAlias(this, "test123456", new TagAliasCallback() {
//            @Override
//            public void gotResult(int i, String s, Set<String> set) {
//                Log.d("alias", "set alias result is" + i);
//            }
//        });
//
        Set<String> sets = new HashSet<>();
        sets.add("sport");//运行第二个模拟器上时把这个注掉
        sets.add("game");
//        sets.add("music");//运行第二个模拟器上时把这个打开

        JPushInterface.setTags(this, sets, new TagAliasCallback() {
            @Override
            public void gotResult(int i, String s, Set<String> set) {
                Log.d("alias", "set tag result is" + i);
            }
        });
    }
}

我们分别运行代码到两个模拟器上,之后我去后台推送一个通知,看下两个模拟器通知栏的变化 
第一次推送标签选择sport,看下效果: 
这里写图片描述

只有第二个模拟器收到了通知

第二次推送标签选择music,看下效果: 
这里写图片描述
这有第一个模拟器收到了通知

第三次我们选择game,两个模拟器共有的标签,看下效果: 
这里写图片描述

这回两个模拟器就都收到了通知

好了,这一章就讲到这里,后面会深入讲解自定义消息

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值