简介
在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);
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() {
@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);
Set<String> sets = new HashSet<>();
sets.add("sport");
sets.add("game");
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,两个模拟器共有的标签,看下效果:
这回两个模拟器就都收到了通知
好了,这一章就讲到这里,后面会深入讲解自定义消息