极光推送使用流程:
1.去极光推送开发者服务网站注册账号
https://www.jiguang.cn/accounts/register/form
2.注册完毕,登陆后创建应用
- 创建完毕获取应用信息
4.创建工程,本次创建以Android Studio为例子
应用名称为极光开发者平台的应用名称
5.创建完毕生成的空的工程,集成极光SDK,本例运用自动集成
1.jcenter自动集成步骤:
使用jcenter自动集成的开发者,不需要在项目中添加jar和so,jcenter会自动完成依赖;
在AndroidManifest.xml中不需要添加任何JPush SDK相关的配置,jcenter会自动导入。
1.确认android studio的Project根目录的主gradle中配置了jcenter支持。(新建Preject默认配置支持)
{
repositories
{
jcenter
()
}
dependencies
{
classpath
'com.android.tools.build:gradle:2.2.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories
{
jcenter
()
}
}
Module build.gradle配置:
AndroidManifest替换变量,在defaultConfig中添加
{
//
选择要添加的对应
cpu
类型的
.so
库
abiFilters
'armeabi',
'armeabi-v7a',
'armeabi-v8a'
//'x86', 'x86_64', 'mips', 'mips64'
}
manifestPlaceholders = [
JPUSH_PKGNAME :
applicationId,
JPUSH_APPKEY :
'a4d4161ac7d2908449605577',
//JPush
上注册的包名对应的
appkey(https://www.jiguang.cn/push)
JPUSH_CHANNEL :
'developer-default'
//
默认值
]
添加依赖
'cn.jiguang.sdk:jpush:3.0.5' //JPush
版本
compile 'cn.jiguang.sdk:jcore:1.1.2'
//JCore
版本
工程根目录文件gradle.properties中添加如下内容
android.useDeprecatedNdk = true
6.配置AndroidManifest.xml
添加权限
<!-- Required -->
<permission
android
:name=
"com.example.lucian.jpushdemo.permission.JPUSH_MESSAGE"
android
:protectionLevel=
"signature"
/>
<!-- Required
一些系统要求的权限,如访问网络等
-->
<uses-permission
android
:name=
"com.example.lucian.jpushdemo.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.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission
android
:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
在Application中添加广播接收器
<!-- User defined. For test only 用户自定义的广播接收器-->
<receiver
android
:name=
"com.example.lucian.jpushdemo.MyReceiver"
android
:exported=
"false"
android
:enabled=
"true"
>
<intent-filter>
<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
用户接收
SDK
通知栏信息的
intent-->
<action
android
:name=
"cn.jpush.android.intent.NOTIFICATION_OPENED"
/>
<!--Required
用户打开自定义通知栏的
intent-->
<action
android
:name=
"cn.jpush.android.intent.CONNECTION"
/>
<!--
接收网络变化 连接
/
断开
since 1.6.3 -->
<category
android
:name=
"com.example.lucian.jpushdemo"
/>
</intent-filter>
</receiver>
7.创建信息接收器MyReceiver,该信息接收器为Manifiest中注册定义的MyReceiver
package com.example.lucian.jpushdemo ;
import
android.content.BroadcastReceiver
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.os.Bundle
;
import
android.support.v4.content.LocalBroadcastManager
;
import
android.text.TextUtils
;
import
android.util.Log
;
import
org.json.JSONException
;
import
org.json.JSONObject
;
import java.util.Iterator
;
import
cn.jpush.android.api.JPushInterface
;
/** * 自定义接收器 * * 如果不定义这个 Receiver ,则: * 1) 默认用户会打开主界面 * 2) 接收不到自定义消息 */ public class
MyReceiver
extends
BroadcastReceiver
{
private static final
String
TAG = "JPush"
;
@Override
public void
onReceive
(
Context context
,
Intent intent
)
{
try
{
Bundle bundle = intent.getExtras
()
;
Log.
d
(
TAG ,
"[MyReceiver] onReceive - " + intent.getAction
() +
", extras: " +
printBundle
(bundle
))
;
if
(
JPushInterface.
ACTION_REGISTRATION_ID.equals (intent.getAction
()))
{
String regId = bundle.getString
(
JPushInterface.
EXTRA_REGISTRATION_ID )
;
Log.
d
(
TAG ,
"[MyReceiver]
接收
Registration Id : " + regId
)
;
//send the Registration Id to your server...
}
else if
(
JPushInterface.
ACTION_MESSAGE_RECEIVED.equals (intent.getAction
()))
{
Log.
d
(
TAG ,
"[MyReceiver]
接收到推送下来的自定义消息
: " + bundle.getString
(
JPushInterface.
EXTRA_MESSAGE ))
;
processCustomMessage
(context
, bundle
)
;
}
else if
(
JPushInterface.
ACTION_NOTIFICATION_RECEIVED.equals (intent.getAction
()))
{
Log.
d
(
TAG ,
"[MyReceiver]
接收到推送下来的通知
"
)
;
int notifactionId = bundle.getInt
(
JPushInterface.
EXTRA_NOTIFICATION_ID )
;
Log.
d
(
TAG ,
"[MyReceiver]
接收到推送下来的通知的
ID: " + notifactionId
)
;
processNotification
(context
, bundle
)
;
}
else if
(
JPushInterface.
ACTION_NOTIFICATION_OPENED.equals (intent.getAction
()))
{
Log.
d
(
TAG ,
"[MyReceiver]
用户点击打开了通知
"
)
;
processNotificationTitle
(context
, bundle
)
;
}
else if
(
JPushInterface.
ACTION_RICHPUSH_CALLBACK.equals (intent.getAction
()))
{
Log.
d
(
TAG ,
"[MyReceiver]
用户收到到
RICH PUSH CALLBACK: " + bundle.getString
(
JPushInterface.
EXTRA_EXTRA ))
;
//
在这里根据
JPushInterface.EXTRA_EXTRA
的内容处理代码,比如打开新的
Activity
, 打开一个网页等
..
}
else if
(
JPushInterface.
ACTION_CONNECTION_CHANGE.equals (intent.getAction
()))
{
boolean connected = intent.getBooleanExtra
(
JPushInterface.
EXTRA_CONNECTION_CHANGE , false
)
;
Log.
w
(
TAG ,
"[MyReceiver]" + intent.getAction
() +
" connected state change to "+connected
)
;
}
else
{
Log.
d
(
TAG ,
"[MyReceiver] Unhandled intent - " + intent.getAction
())
;
}
}
catch
(
Exception e
)
{
}
}
//
打印所有的
intent extra
数据
private static
String
printBundle
(
Bundle bundle
)
{
StringBuilder sb =
new StringBuilder
()
;
for
(
String key : bundle.keySet
())
{
if
(key.equals
(
JPushInterface.
EXTRA_NOTIFICATION_ID ))
{
sb.append
(
"
\n
key:" + key +
", value:" + bundle.getInt
(key
))
;
}
else if
(key.equals
(
JPushInterface.
EXTRA_CONNECTION_CHANGE ))
{
sb.append
(
"
\n
key:" + key +
", value:" + bundle.getBoolean
(key
))
;
}
else if
(key.equals
(
JPushInterface.
EXTRA_EXTRA ))
{
if
(
TextUtils.
isEmpty
(bundle.getString
(
JPushInterface.
EXTRA_EXTRA )))
{
Log.
i
(
TAG ,
"This message has no Extra data"
)
;
continue;
}
try
{
JSONObject json =
new JSONObject
(bundle.getString
(
JPushInterface.
EXTRA_EXTRA ))
;
Iterator<
String> it = json.keys
()
;
while
(it.hasNext
())
{
String myKey = it.next
().toString
()
;
sb.append
(
"
\n
key:" + key +
", value: [" +
myKey + " - " +json.optString
(myKey
) +
"]"
)
;
}
}
catch
(
JSONException e
)
{
Log.
e
(
TAG ,
"Get message extra JSON error!"
)
;
}
}
else
{
sb.append
(
"
\n
key:" + key +
", value:" + bundle.getString
(key
))
;
}
}
return sb.toString
()
;
}
//send msg to MainActivity
private void
processCustomMessage
(
Context context
,
Bundle bundle
)
{
if
(
JPushActivity.
isForeground )
{
String message = bundle.getString
(
JPushInterface.
EXTRA_MESSAGE )
;
String extras = bundle.getString
(
JPushInterface.
EXTRA_EXTRA )
;
Intent msgIntent =
new Intent
(
JPushActivity.
MESSAGE_RECEIVED_ACTION )
;
msgIntent.putExtra
(
JPushActivity.
KEY_MESSAGE , message
)
;
if
(!extras.isEmpty
())
{
try
{
JSONObject extraJson =
new JSONObject
(extras
)
;
if
(extraJson.length
() >
0
)
{
msgIntent.putExtra
(
JPushActivity.
KEY_EXTRAS , extras
)
;
}
}
catch
(
JSONException e
)
{
}
}
LocalBroadcastManager.
getInstance
(context
).sendBroadcast
(msgIntent
)
;
}
}
//send msg to MainActivity
private void
processNotification
(
Context context
,
Bundle bundle
)
{
if
(
JPushActivity.
isForeground )
{
String extras = bundle.getString
(
JPushInterface.
EXTRA_EXTRA )
;
String notification = bundle.getString
(
JPushInterface.
EXTRA_ALERT )
;
Intent msgIntent =
new Intent
(
JPushActivity.
MESSAGE_RECEIVED_ACTION )
;
msgIntent.putExtra
(
JPushActivity.
KEY_MESSAGE , notification
)
;
if
(!extras.isEmpty
())
{
try
{
JSONObject extraJson =
new JSONObject
(extras
)
;
if
(extraJson.length
() >
0
)
{
msgIntent.putExtra
(
JPushActivity.
KEY_EXTRAS , extras
)
;
}
}
catch
(
JSONException e
)
{
}
}
LocalBroadcastManager.
getInstance
(context
).sendBroadcast
(msgIntent
)
;
}
}
private void
processNotificationTitle
(
Context context
,
Bundle bundle
)
{
if
(
JPushActivity.
isForeground )
{
//
进入下一个
Activity
前的处理
Intent i =
new Intent
(context
,
TestActivity.
class
)
;
i.putExtras
(bundle
)
;
//i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setFlags
(
Intent.
FLAG_ACTIVITY_NEW_TASK | Intent.
FLAG_ACTIVITY_CLEAR_TOP )
;
context.startActivity
(i
)
;
//
下一个
Activity
的处理
/*Intent intent = getIntent();
if (null != intent) {
Bundle bundle = getIntent().getExtras();
String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
String content = bundle.getString(JPushInterface.EXTRA_ALERT);
}*/
}
}
}
8.创建JPushActivity
package com.example.lucian.jpushdemo ;
import
android.content.BroadcastReceiver
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.content.IntentFilter
;
import
android.net.ConnectivityManager
;
import
android.net.NetworkInfo
;
import
android.os.Handler
;
import
android.support.v4.content.LocalBroadcastManager
;
import
android.text.TextUtils
;
import
android.util.Log
;
import
android.widget.Toast
;
import
java.util.LinkedHashSet
;
import java.util.Set
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
cn.jpush.android.api.JPushInterface
;
import cn.jpush.android.api.TagAliasCallback
;
/** * Created by qulus on 2017/6/29 0029. */
public class
JPushActivity
{
private static final
String
TAG = "JPushActivity"
;
private static
Context
mContext ;
public static boolean
isForeground = true;
//
接收到信息是否传递给
Activity
private
String
receiveResult
;
public
JPushActivity
()
{}
public
JPushActivity
(
Context context
)
{
this.
mContext = context ;
}
private
MessageReceiver
mMessageReceiver
;
public static final
String
MESSAGE_RECEIVED_ACTION = "com.example.jpushdemo.MESSAGE_RECEIVED_ACTION"
;
public static final
String
KEY_TITLE = "title"
;
public static final
String
KEY_MESSAGE = "message"
;
public static final
String
KEY_EXTRAS = "extras"
;
/** * 注册信息接收 */ public void
registerMessageReceiver
()
{
mMessageReceiver =
new
MessageReceiver
()
;
IntentFilter filter =
new IntentFilter
()
;
filter.setPriority
(
IntentFilter.
SYSTEM_HIGH_PRIORITY )
;
filter.addAction
(
MESSAGE_RECEIVED_ACTION )
;
LocalBroadcastManager.
getInstance
(
mContext ).registerReceiver
(
mMessageReceiver
,filter
)
;
}
/** * 设置接收到信息是否向下传递给 Activity */ public void
setIsForeground
(
boolean isForeground
)
{
this.
isForeground = isForeground ;
}
/** * 停止 Push 信息 */ public void
stopPush
()
{
JPushInterface.
stopPush
(
mContext )
;
}
/** * 重启 Push */ public void
resumePush
()
{
JPushInterface.
resumePush
(
mContext )
;
}
/** * 初始化推送服务,不初始化,无法接收到信息 */ public void
initJPush
()
{
JPushInterface.
setDebugMode
(
true
)
;
JPushInterface.
init
(
mContext )
;
}
/** * 取消注册接收服务 */ public void
unregisterReceiver
()
{
LocalBroadcastManager.
getInstance
(
mContext ).unregisterReceiver
(
mMessageReceiver
)
;
}
/** * 信息接收器,接收到信息后的处理 */ public class
MessageReceiver
extends
BroadcastReceiver
{
@Override
public void
onReceive
(
Context context
,
Intent intent
)
{
if
(
MESSAGE_RECEIVED_ACTION.equals (intent.getAction
()))
{
String message = intent.getStringExtra
(
KEY_MESSAGE )
;
String extras = intent.getStringExtra
(
KEY_EXTRAS )
;
StringBuilder showMsg =
new StringBuilder
()
;
showMsg.append
(
KEY_MESSAGE + " : " + message +
"
\n
"
)
;
if
(!
(
null == extras
))
{
showMsg.append
(
KEY_EXTRAS + " : " + extras +
"
\n
"
)
;
}
Toast.
makeText
(
mContext ,showMsg.toString
()
,
Toast.
LENGTH_SHORT ).show
()
;
receiveResult = showMsg.toString
()
;
}
}
}
/** * 获取接收到的信息 */ public
String
getReceiveResult
()
{
return
receiveResult
;
}
/** * 为设备设置标签 */ public static void
setTag
(
String tag
)
{
//
检查
tag
的有效性
if
(
TextUtils.
isEmpty
(tag
))
{
return;
}
// ","
隔开的多个 转换成
Set
String[] sArray = tag.split
(
","
)
;
Set<
String> tagSet =
new LinkedHashSet<
String>
()
;
for
(
String sTagItme : sArray
)
{
if
(!
isValidTagAndAlias
(sTagItme
))
{
Log.
e
(
TAG ,
"error_tag_gs_empty"
)
;
return;
}
tagSet.add
(sTagItme
)
;
}
//
调用
JPush API
设置
Tag
mHandler.sendMessage (
mHandler.obtainMessage (
MSG_SET_TAGS , tagSet
))
;
}
/** * 为设备设置别名 */ public void
setAlias
(
String alias
)
{
//
检查
alias
的有效性
if
(
TextUtils.
isEmpty
(alias
))
{
return;
}
if
(!
isValidTagAndAlias
(alias
))
{
Log.
e
(
TAG ,
"error_alias_empty"
)
;
return;
}
//
调用
JPush API
设置
Alias
mHandler.sendMessage (
mHandler.obtainMessage (
MSG_SET_ALIAS , alias
))
;
}
//
校验
Tag Alias
只能是数字
,
英文字母和中文
public static boolean
isValidTagAndAlias
(
String s
)
{
Pattern p =
Pattern.
compile
(
"^[
\u4E00
-
\u9FA5
0-9a-zA-Z_!@#$&*+=.|]+$"
)
;
Matcher m = p.matcher
(s
)
;
return m.matches
()
;
}
private static final int
MSG_SET_ALIAS = 1001
;
private static final int
MSG_SET_TAGS = 1002
;
private final static
Handler
mHandler = new
Handler
()
{
@Override
public void
handleMessage
(
android.os.Message msg
)
{
super.handleMessage
(msg
)
;
switch
(msg.
what
)
{
case
MSG_SET_ALIAS:
Log.
d
(
TAG ,
"Set alias in handler."
)
;
JPushInterface.
setAliasAndTags
(
mContext ,
(
String
) msg.
obj
, null,
mAliasCallback )
;
break;
case
MSG_SET_TAGS:
Log.
d
(
TAG ,
"Set tags in handler."
)
;
JPushInterface.
setAliasAndTags
(
mContext , null,
(Set<
String>
) msg.
obj
,
mTagsCallback )
;
break;
default:
Log.
i
(
TAG ,
"Unhandled msg - " + msg.
what
)
;
}
}
}
;
/** * 设置别名的回调函数 */ private final static TagAliasCallback
mAliasCallback = new
TagAliasCallback
()
{
@Override
public void
gotResult
(
int code
,
String alias
, Set<
String> tags
)
{
String LogUtilss
;
switch
(code
)
{
case
0:
LogUtilss = "Set tag and alias success"
;
Log.
i
(
TAG , LogUtilss
)
;
break;
case
6002:
LogUtilss = "Failed to set alias and tags due to timeout. Try again after 60s."
;
Log.
i
(
TAG , LogUtilss
)
;
if
(
isConnected
(
mContext ))
{
mHandler.sendMessageDelayed (
mHandler.obtainMessage (
MSG_SET_ALIAS , alias
)
,
1000 *
60
)
;
}
else
{
Log.
i
(
TAG ,
"No network"
)
;
}
break;
default:
LogUtilss = "Failed with errorCode = " + code
;
Log.
e
(
TAG , LogUtilss
)
;
}
}
}
;
/** * 设置标签回调函数 */ private final static TagAliasCallback
mTagsCallback = new
TagAliasCallback
()
{
@Override
public void
gotResult
(
int code
,
String alias
, Set<
String> tags
)
{
String LogUtilss
;
switch
(code
)
{
case
0:
LogUtilss = "Set tag and alias success"
;
Log.
i
(
TAG , LogUtilss
)
;
break;
case
6002:
LogUtilss = "Failed to set alias and tags due to timeout. Try again after 60s."
;
Log.
i
(
TAG , LogUtilss
)
;
if
(
isConnected
(
mContext ))
{
mHandler.sendMessageDelayed (
mHandler.obtainMessage (
MSG_SET_TAGS , tags
)
,
1000 *
60
)
;
}
else
{
Log.
i
(
TAG ,
"No network"
)
;
}
break;
default:
LogUtilss = "Failed with errorCode = " + code
;
Log.
e
(
TAG , LogUtilss
)
;
}
}
}
;
/** * 检测设备是否联网 */ public static boolean
isConnected
(
Context context
)
{
ConnectivityManager conn =
(
ConnectivityManager
) context.getSystemService
(
Context.
CONNECTIVITY_SERVICE )
;
NetworkInfo info = conn.getActiveNetworkInfo
()
;
return
(info !=
null && info.isConnected
())
;
}
}
9.在需要的地方初始化JPush和注册信息接收器
package com.example.lucian.jpushdemo ;
import
android.support.v7.app.AppCompatActivity
;
import
android.os.Bundle
;
public class
MainActivity
extends
AppCompatActivity
{
private
JPushActivity
mJPush
;
@Override
protected void
onCreate
(
Bundle savedInstanceState
)
{
super.onCreate
(savedInstanceState
)
;
setContentView
(
R.layout.
activity_main )
;
mJPush =
new JPushActivity
(
this
)
;
mJPush.initJPush
()
;
//
初始化极光推送
mJPush.registerMessageReceiver
()
;
//
注册信息接收器
mJPush.
setTag
(
"admin1,admin2"
)
;
//
为设备设置标签
mJPush.
setAlias
(
"automic"
)
;
//
为设备设置别名
}
}
10.通过极光推送开发者服务平台测试,是否能接收到信息,可根据设置的标签,别名,等形式发送,可发送通知和自定义消息
11.推送历史: