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

来源:互联网 发布:java ee api下载 编辑:程序博客网 时间:2024/06/04 19:05

简介

在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.jpushexample07-30 12:36:45.621 19470-19493/com.example.hfs.jpushexample D/JPush: [NetworkingClient] Action - receivedCommand - cmd:307-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_RECEIVED07-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,两个模拟器共有的标签,看下效果:
这里写图片描述

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

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

10 0
原创粉丝点击