- 复制 libs/jcore-android_v1.x.y.jar 到工程 libs/ 目录下
- 复制 libs/jpush-android_v3.x.y.jar 到工程 libs/ 目录下
- 复制 libs/(cpu-type)/libjcore1xy.so到你的工程中存放对应cpu类型的目录
- 复制 res/ 中drawable-hdpi, layout, values文件夹中的资源文件到你的工程中 res/ 对应同名的目录下
配置AndroidManifest.xml文件清单
添加相关权限
<permission android:name="您的包名.permission.JPUSH_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="您的包名.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" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <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" /> <uses-permission android:name="android.permission.GET_TASKS" />
配置极光SDK需要的服务 广播接受者等
<!--以下配置 JPush SDK 核心功能,added by tanglt start--> <!-- 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="您的包名" /> </intent-filter> </service> <!--SDK核心功能--> <service android:name="cn.jpush.android.service.DownloadService" android:enabled="true" android:exported="false" /> <!-- 可配置android:process参数将PushService放在其他进程中 --> <service android:name="cn.jpush.android.service.PushService" android:process=":push"> <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> <!-- Rich push 核心功能 since 2.0.6--> <activity android:name="cn.jpush.android.ui.PopWinActivity" android:exported="false" android:theme="@style/MyDialogStyle"/> <!--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="您的包名" /> </intent-filter> </activity> <!--SDK核心功能--> <receiver android:name="cn.jpush.android.service.PushReceiver" android:enabled="true"> <intent-filter android:priority="1000"> <!--Required 显示通知栏 --> <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <category android:name="您的包名" /> </intent-filter> <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> <!--SDK核心功能--> <receiver android:name="cn.jpush.android.service.AlarmReceiver" android:exported="false" /> <!--用户自定义的广播接收器--> <receiver android:name=".receiver.JPushCustomerReceiver" android:enabled="true" android:exported="false"> <intent-filter> <!--Required 用户注册SDK的intent--> <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 用户打开自定义通知栏的intent--> <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!-- 接收网络变化 连接/断开 since 1.6.3 --> <action android:name="cn.jpush.android.intent.CONNECTION" /> <category android:name="您的包名" /> </intent-filter> </receiver> <!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道--> <!-- 例如: --> <!-- 发到 Google Play 的APK可以设置为 google-play--> <!-- 发到其他市场的 APK 可以设置为 xxx-market --> <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default" /> <!--值来自开发者平台取得的AppKey--> <meta-data android:name="JPUSH_APPKEY" android:value="00000000" /> <!-- 以上配置 JPush SDK 核心功能,added by tanglt end-->
代码混淆(proguard.pro文件)
-dontoptimize
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }
注意:如果编译apk为release版本报错
Error:Execution failed for
task:iMAPP_C_ANDROID:transformClassesAndResourcesWithProguardForRelease’.
java.io.IOException: Please correct the above warnings first.
请在proguard.pro文件中添加 -ignorewarnings#忽略警告
初始化SDK
本应用程序Application 类
JPushInterface.setDebugMode(true);// 设置调试模式
JPushInterface.init(this);
JPush SDK 收到推送,通过广播的方式,转发给开发者App,这样开发者就可以灵活地进行处理
这个动作不是必须的。用户有需要才定义 Receiver 类来处理SDK过来的广播,如果不做这个动作,
即不写自定义 Receiver也不在 AndroidManifest.xml 里配置这个 Receiver则默认的行为是:
接收到推送的自定义消息,则没有被处理
可以正常收到通知,用户点击打开应用主界面
清除通知
推送通知到客户端时,由 JPush SDK 展现通知到通知栏上。 此API提供清除通知的功能 包括: 清除所有JPush展现的通知(不包括非JPush SDK展现的) public static void clearAllNotifications(Context context); 清除指定某个通知 public static void reportNotificationOpened(Context context, String msgId) context:应用的 ApplicationContext msgId:推送每一条消息和通知对应的唯一 ID(msgId 来源于发送消息和通知的Extra字段
设置推送时间
默认情况下用户在任何时间都允许推送。即任何时候有推送下来,客户端都会收到,并展示。(开发者可以调用 此API来设置允许推送的时间)如果不在该时间段内收到消息,当前的行为是:推送到的通知会被扔掉 public static void setPushTime(Context context, Set<Integer> weekDays, int startHour, int endHour) context:应用的ApplicationContext days:0表示星期天,1表示星期一,以此类推。 (7天制,Set集合里面的int范围为0到6) [Sdk1.2.9 – 新功能:set的值为null,则任何时间都可以收到消息和通知,set的size为0,则表示任何时间都收不到消息和通知] startHour:允许推送的开始时间 (24小时制:startHour的范围为0到23) endHour:允许推送的结束时间 (24小时制:endHour的范围为0到23) 代码示例:此代码表示周一到周五、上午10点到晚上23点,都可以推送 Set<Integer> days = new HashSet<Integer>(); days.add(1); days.add(2); days.add(3); days.add(4); days.add(5); JPushInterface.setPushTime(getApplicationContext(), days, 10, 23);
设置静音推送通知
默认情况下用户在收到推送通知时,客户端可能会有震动,响铃等提示。但用户在睡觉、开会等时间点希望为 "免打扰" 模式也是静音时段的概念 调用此 API 来设置静音时段。如果在该时间段内收到消息,则:不会有铃声和震动 public static void setSilenceTime(Context context, int startHour, int startMinute, int endHour, int endMinute) Context context 应用的ApplicationContext int startHour 静音时段的开始时间 - 小时 (24小时制,范围:0~23 ) int startMinute 静音时段的开始时间 - 分钟(范围:0~59 ) int endHour 静音时段的结束时间 - 小时 (24小时制,范围:0~23 ) int endMinute 静音时段的结束时间 - 分钟(范围:0~59 ) 示例代码:表示晚上10:30点到第二天早上8:30点为静音时段 JPushInterface.setSilenceTime(getApplicationContext(), 22, 30, 8, 30)
设置保留最近通知数
通过极光推送,推送了很多通知到客户端时,如果用户不去处理,就会有很多保留在那里 新版本 SDK (v1.3.0) 增加此功能,限制保留的通知条数。默认为保留最近 5 条通知 开发者可通过调用此 API 来定义为不同的数量 (注意:仅对通知有效。所谓保留最近的,意思是,如果有新的通知到达,之前列表里最老的那条会被移除。 例如,设置为保留最近 5 条通知。假设已经有 5 条显示在通知栏,当第 6 条到达时,第 1 条将会被移除) public static void setLatestNotificationNumber(Context context, int maxNum) 本接口可以在 JPushInterface.init 之后任何地方调用。可以调用多次。SDK使用最后调用的数值
消息的生命周期
当一条消息从开发者AppServer(通过API调用)或者Portal上通过 JPush 推送后,不意味着这条消息马上就成功地推送到了用户设备上。 实际上,这只是意味着,这条消息被极光推送服务器接收,进入准备推送状态。这条消息被接收后会怎么样,还要依赖于多个因素。 理想情况下,当用户设备与服务器正在保持连接,也没有其他导致这条消息会被丢弃的因素存在,则用户马上会收到这条消息。 接下来,看 time_to_live 字段的指定情况。如果为 0 ,表示该消息不保存离线,即如果用户当前不在线,则用户就会一直收不到该消息。 time_to_live 大于 0 时会保留指定时长的离线消息时间。之后看 override_msg_id 是否被指定。如果新的一条消息, 其 override_msg_id 与离线消息里已经存在的一条相同,则这条新的消息会覆盖老的消息
离线消息
JPush 当前默认支持 5 条离线消息。 Android 平台上,用户上线时,会把离线消息推送下去。 离线消息默认的保留时长是 1 天。 API 2.0 提供一个 time_to_live 字段,允许调用推送消息时,设置保留的时长。以秒为单位。如果为 0 表示不保留离线消息,即只对在线的用户推送消息。最长为 10 天。 消息覆盖 JPush 基于 override_msg_id 来定义消息覆盖逻辑 即对于同一个应用,如果新的一条消息其 override_msg_id 存在并与老的一条消息相同,则会被认为是要覆盖老的消息。 这个情况对于是否保存离线消息有所不同: 如果客户端已经收到,用户已经点击打开通知:则新的消息(override_msg_id 存在的消息)还是会显示在通知栏,用户看到的是有新的一条消息。 如果客户端已经收到,但还在通知栏:则新的消息会在通知栏上覆盖老的消息。用户看到新的消息内容。 如果客户端还未收到,消息还在离线消息里,则:新的消息会覆盖老的消息,用户不会收到老的消息
消息删除
一般来说,一条消息推送出来后,如果某用户在线,则他会立即收到,所以没有反悔(删除)的机会了。 JPush 提供消息覆盖的机制,使得你可以有机会可以更新暂时离线的用户最后会收到的消息。 JPush 暂未开放删除 “离线消息” 的机制与接口。如果特殊原因有需求,请发邮件到 support@jpush.cn 由极光推送支持人员来操作。 推送顺序 极光推送不保证:推送消息的顺序,客户端也以相同的顺序接收到。 但是大多数时候用户收到的消息是按顺序推送的,即使保存离线消息也是有顺序的