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下载下来运行一遍,就可以看见效果了
这边我已经下来过了,所以我就直接把效果图贴出来,方便大家观看
Android 中使用极光推送消息详细介绍(一)_第1张图片
在极光推送的后台输入:JPushTest后,点击发送,客户端这便就会受到通知,这只是一个简单的效果

实现

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

注册账号拿到AppKey

第一步就是要去官网注册账号,之后点击开发者服务选极光推送
这里写图片描述
第二步就是点击立即使用
Android 中使用极光推送消息详细介绍(一)_第2张图片
第三步 创建应用
Android 中使用极光推送消息详细介绍(一)_第3张图片
第四步 填写应用信息
Android 中使用极光推送消息详细介绍(一)_第4张图片
第五步 拿到AppKey
Android 中使用极光推送消息详细介绍(一)_第5张图片

新建一个工程

把刚才下载好的SDK解压出来
Android 中使用极光推送消息详细介绍(一)_第6张图片
打开libs文件夹
Android 中使用极光推送消息详细介绍(一)_第7张图片
其中有两部分,把jpush-android-2.1.7.jar这个jar包复制到我们工程的libs下面,之后在app/src/main文件夹下面新建一个文件夹,叫:jniLibs,把刚才除了jpush-android-2.1.7.jar这个以外所有的文件夹都放到这里
Android 中使用极光推送消息详细介绍(一)_第8张图片

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

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

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

    
    "${applicationId}.permission.JPUSH_MESSAGE"/>
    "android.permission.RECEIVE_USER_PRESENT"/>
    "android.permission.INTERNET"/>
    "android.permission.WAKE_LOCK"/>
    "android.permission.READ_PHONE_STATE"/>
    "android.permission.WRITE_EXTERNAL_STORAGE"/>
    "android.permission.READ_EXTERNAL_STORAGE"/>
    "android.permission.WRITE_SETTINGS"/>
    "android.permission.VIBRATE"/>
    "android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    "android.permission.ACCESS_NETWORK_STATE"/>
    "android.permission.ACCESS_WIFI_STATE"/>
    "android.permission.SYSTEM_ALERT_WINDOW"/>


    
    "android.permission.ACCESS_COARSE_LOCATION"/>
    "android.permission.CHANGE_WIFI_STATE"/>
    "android.permission.ACCESS_FINE_LOCATION"/>
    "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
    "android.permission.CHANGE_NETWORK_STATE"/>

    "true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        ".MainActivity">
            
                "android.intent.action.MAIN"/>

                "android.intent.category.LAUNCHER"/>
            
        
        ".TestActivity"/>
        
        "cn.jpush.android.ui.PushActivity"
            android:configChanges="orientation|keyboardHidden"
            android:exported="false"
            android:theme="@android:style/Theme.NoTitleBar">
            
                "cn.jpush.android.ui.PushActivity"/>

                "android.intent.category.DEFAULT"/>
                "${applicationId}"/>
            
        
        
        "cn.jpush.android.service.DownloadService"
            android:enabled="true"
            android:exported="false">
        


        
        
        "cn.jpush.android.service.PushService"
            android:enabled="true"
            android:exported="false">
            
                "cn.jpush.android.intent.REGISTER"/>
                "cn.jpush.android.intent.REPORT"/>
                "cn.jpush.android.intent.PushService"/>
                "cn.jpush.android.intent.PUSH_TIME"/>
            
        

        
        
        "cn.jpush.android.service.DaemonService"
            android:enabled="true"
            android:exported="true">
            
                "cn.jpush.android.intent.DaemonService"/>
                "${applicationId}"/>
            

        

        
        "cn.jpush.android.service.PushReceiver"
            android:enabled="true"
            android:exported="false">
            "1000">
                "cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/>   
                "${applicationId}"/>
            
            
                "android.intent.action.USER_PRESENT"/>
                "android.net.conn.CONNECTIVITY_CHANGE"/>
            
            
            
                "android.intent.action.PACKAGE_ADDED"/>
                "android.intent.action.PACKAGE_REMOVED"/>

                "package"/>
            

        

        
        "cn.jpush.android.service.AlarmReceiver"
            android:exported="false"/>

        
        ".MyReceiver"
            android:enabled="true"
            android:exported="false">
            
                "cn.jpush.android.intent.REGISTRATION"/> 
                "cn.jpush.android.intent.UNREGISTRATION"/>
                "cn.jpush.android.intent.MESSAGE_RECEIVED"/> 
                "cn.jpush.android.intent.NOTIFICATION_RECEIVED"/> 
                "cn.jpush.android.intent.NOTIFICATION_OPENED"/> 
                "cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK"/> 
                "cn.jpush.android.intent.CONNECTION"/>
                "${applicationId}"/>
            
        


        
        "JPUSH_CHANNEL"
            android:value="developer-default"/>
        "JPUSH_APPKEY"
            android:value="665d69121981502b7929625c"/> 
    

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

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

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

这样,最基本的功能完成了,我们看下效果
Android 中使用极光推送消息详细介绍(一)_第9张图片

修改通知标题

极光推送默认的通知标题是我们在创建应用时输入的应用名字,这有时不符合我们的要求,所以我们就要自己设置标题了,那么怎么设置呢?
极光推送已经为我们考虑到了这个问题了,我们只要在推送时输入我们要推送的标题即可,在立即发送上面有一个可选设置,打开就可以自定义标题了
Android 中使用极光推送消息详细介绍(一)_第10张图片

这回我们修改下标题,再看下效果
Android 中使用极光推送消息详细介绍(一)_第11张图片

发送消息

这个发送消息和上面的发送通知还是有区别的.发送通知可以直接展示在客户端上,但是发送消息客户端那边虽然接收到了,但是并不显示(不明觉厉???看下效果)
我在后台发送一个消息,我们观察下模拟器的变化
Android 中使用极光推送消息详细介绍(一)_第12张图片

好吧,模拟器什么都没有….
那怎么知道我们发送成功呢?
我们可以看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展示到通知栏上。其内容完全由开发者自己定义。
自定义消息主要用于应用的内部业务逻辑。一条自定义消息推送过来,有可能没有任何界面显示。

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

有时我们并不是想把内容都发送给所有的用户,比如有的用户喜欢玩游戏,我们就把跟游戏有关的内容推送给他们即可,那么怎么实现呢?
在推送对象里面有个目标人群,在那里我们可以选择我们要推送的目标人群
Android 中使用极光推送消息详细介绍(一)_第13张图片

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 set) {
                Log.d("alias", "set alias result is" + i);
            }
        });
    }
}

好了,我们运行下程序,再看下效果
Android 中使用极光推送消息详细介绍(一)_第14张图片

######标签(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 set) {
//                Log.d("alias", "set alias result is" + i);
//            }
//        });
//
        Set 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 set) {
                Log.d("alias", "set tag result is" + i);
            }
        });
    }
}

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

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

第二次推送标签选择music,看下效果:

这有第一个模拟器收到了通知

第三次我们选择game,两个模拟器共有的标签,看下效果:

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

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

你可能感兴趣的:(Android)