复制 libs/armeabi/libjpush.so 到工程 libs/armeabi 目录下
根据 SDK 压缩包里的 AndroidManifest.xml 样例文件,来配置应用程序项目的 AndroidManifest.xml 。
主要步骤为:
权限配置:
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<manifest xmlns:android=
"<a href="http://schemas.android.com/apk/res/android" "="" style="outline: none; color: rgb(0, 109, 175); border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.2em !important; margin: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; background: none !important;">http://schemas.android.com/apk/res/android"
package
=
"Your Package"
android:versionCode=
"100"
android:versionName=
"1.0.0"
>
<!-- Required -->
<permission android:name=
"Your Package.permission.JPUSH_MESSAGE"
android:protectionLevel=
"signature"
/>
<!-- Required -->
<uses-permission android:name=
"You Package.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.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.WRITE_SETTINGS"
/> <!--since
1.6
.
0
-->
<!-- Optional. Required
for
location feature -->
<uses-permission android:name=
"android.permission.ACCESS_COARSE_LOCATION"
/>
<uses-permission android:name=
"android.permission.ACCESS_COARSE_UPDATES"
/>
<uses-permission android:name=
"android.permission.ACCESS_WIFI_STATE"
/>
<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"
/>
应用包名及appkey替换:
<application
android:icon=
"@drawable/ic_launcher"
android:label=
"@string/app_name"
android:name=
"Your Application"
>
<!-- Required -->
<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>
<!-- Required -->
<receiver
android:name=
"cn.jpush.android.service.PushReceiver"
android:enabled=
"true"
>
<intent-filter android:priority=
"1000"
> <!--since
1.3
.
5
-->
<action android:name=
"cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"
/> <!--since
1.3
.
5
-->
<category android:name=
"Your Package"
/> <!--since
1.3
.
5
-->
</intent-filter> <!--since
1.3
.
5
-->
<intent-filter>
<action android:name=
"android.intent.action.USER_PRESENT"
/>
<action android:name=
"android.net.conn.CONNECTIVITY_CHANGE"
/>
</intent-filter>
<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核心功能-->
<activity
android:name=
"cn.jpush.android.ui.PushActivity"
android:theme=
"@android:style/Theme.Translucent.NoTitleBar"
android:configChanges=
"orientation|keyboardHidden"
>
<intent-filter>
<action android:name=
"cn.jpush.android.ui.PushActivity"
/>
<category android:name=
"android.intent.category.DEFAULT"
/>
<category android:name=
"Your Package"
/>
</intent-filter>
</activity>
<!-- Required SDK核心功能-->
<service
android:name=
"cn.jpush.android.service.DownloadService"
android:enabled=
"true"
android:exported=
"false"
>
</service>
<!-- Required SDK核心功能-->
<receiver android:name=
"cn.jpush.android.service.AlarmReceiver"
/>
<!-- Required. For publish channel feature -->
<!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。-->
<!-- 例如: -->
<!-- 发到 Google Play 的APK可以设置为 google-play; -->
<!-- 发到其他市场的 APK 可以设置为 xxx-market。 -->
<!-- 目前这个渠道统计功能的报表还未开放。-->
<meta-data android:name=
"JPUSH_CHANNEL"
android:value=
"developer-default"
/>
<!-- Required. AppKey copied from Portal -->
<meta-data android:name=
"JPUSH_APPKEY"
android:value=
"Your AppKey"
/>
</application>
</manifest>
|
JPush SDK 提供的 API 接口,都主要集中在 cn.jpush.android.api.JPushInterface 类里。
public
static
void
init(Context context)
|
// You can enable debug mode in developing state. You should close debug mode when release.
public
static
void
setDebugMode(
boolean
debugEnalbed)
|
public
class
ExampleApplication
extends
Application {
@Override
public
void
onCreate() {
super
.onCreate();
JPushInterface.setDebugMode(
true
);
JPushInterface.init(
this
);
}
}
|
如果 SDK 工作正常,则日志信息会如下图所示:
如图所示,客户端启动分为 4 步:
为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。
每个用户只能指定一个别名。
同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。
系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端API会同时给这多个用户发送消息。
举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时,发现该用户 3 天没有玩游戏了,则根据 userid 调用服务器端API发通知到客户端提醒用户。
为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push 消息。
可为每个用户打多个标签。
不同应用程序、不同的用户,可以打同样的标签。
举例: game, old_page, women
调用此 API 来同时设置别名与标签。
需要理解的是,这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
在之前调用过后,如果需要再次改变别名与标签,只需要重新调用此 API 即可。
开始支持的版本:1.5.0.
public
static
void
setAliasAndTags(Context context, String alias, Set<String> tags, TagAliasCallback callback)
|
在 TagAliasCallback 的 gotResult 方法,返回对应的参数 alias, tags。并返回对应的状态码:0为成功,其他返回码请参考错误码定义。
调用此 API 来设置别名。
需要理解的是,这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
开始支持的版本:1.5.0.
public
static
void
setAlias(Context context, String alias, TagAliasCallback callback)
|
参数定义
在TagAliasCallback 的 gotResult 方法,返回对应的参数 alias, tags。并返回对应的状态码:0为成功,其他返回码请参考错误码定义。
调用此 API 来设置标签。
需要理解的是,这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
开始支持的版本:1.5.0.
public
static
void
setTags(Context context, Set<String> tags, TagAliasCallback callback)
|
在 TagAliasCallback 的 gotResult 方法,返回对应的参数 alias, tags。并返回对应的状态码:0为成功,其他返回码请参考错误码定义。
1.5.0
public
static
Set<String> filterValidTags(Set<String> tags)
|
有效的 tag 集合。
设置别名与标签方法的回调类,可在 gotResult 方法上得到回调的结果。回调 responseCode = 0,则确认设置成功。
开始支持的版本:1.5.0
public
void
gotResult(
int
responseCode, String alias, Set<String> tags);
|
responseCode
其他返回码请参考错误码定义。
Code | 描述 | 详细解释 |
---|---|---|
6001 | 无效的设置,tag/alias 不应参数都为 null | |
6002 | 设置超时 | 建议重试 |
6003 | alias 字符串不合法 | 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。 |
6004 | alias超长。最多 40个字节 | 中文 UTF-8 是 3 个字节 |
6005 | 某一个 tag 字符串不合法 | 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。 |
6006 | 某一个 tag 超长。一个 tag 最多 40个字节 | 中文 UTF-8 是 3 个字节 |
6007 | tags 数量超出限制。最多 100个 | 这是一台设备的限制。一个应用全局的标签数量无限制。 |
6008 | tag/alias 超出总长度限制。总长度最多 1K 字节 |