几乎每个项目都会用到推送吧!我从2015年起到现在其中极光推送用了N次了,最近项目又要用到极光推送,刚好又要做网易博客迁移所以来复习一下。但距离上次使用是在2年前联想的项目上,翻了翻笔记,如图:
记得当时的项目推送弄得挺费劲的,先是我自己弄了个官网的但后来经过沟通说,要用我们联想内部的推送功能,它是在官网的基础上套了一层叫“乐推送”,而写后台的人是其他部门的,大公司是很好很规范但中间要走很多的流程,这效率真不敢恭维了!为了方便查阅使用而且下次很快就能搞定这个功能,我决定还是写一篇文章整理整理当初的笔记,一来当做分享二来方便自己查阅修改,比起在电脑中找文件文档笔记还是要方便很多的,这也是我写博客的初衷,好了废话不多说步入正题!
我实践成功源码地址:https://download.csdn.net/download/yudbl/10843855
极光官网:https://www.jiguang.cn/
极光官方文档:http://docs.jiguang.cn/resources/
1、新建项目
新建项目,定义好包名2、创建应用,下载极光Demo
进入极光官网,注册登录,看到如下里面是我以前创建的应用,创建新的应用点击“创建应用”输入你当前项目的应用名称、应用图标
创建成功,如下图:(记住保密AppKey、Master Secret,我的是示例等下删除就无所谓了!)
点击“完成推送设置”,输入“应用包名” 对应 “项目清单文件的主包名”
点击下载Demo
下载完成后,建一个文件夹,把压缩包解压,如下图:
3、手动集成极光推送
3.1、集成指南,官方SDK下载
点击“查看集成指南”
客户端 SDK 下载
点击 Android SDK概述—>Android 客户端 SDK 下载—>Android SDK 下载
下载后,解压
浏览器后退,找到:Android SDK 集成指南—>手动集成步骤
3.2、导入jar包、so文件、res资源文件
导入jar包:
打开解压后的“jpush-android-3.1.7-release” 或 “JPushExample(1143290)”,找到libs文件夹
全选里面的资源文件 复制到 自己的项目工程里面的libs文件夹里面
导入so文件:
使用 android studio 的开发者,如果使用 jniLibs 文件夹导入 so 文件,则仅需将所有 cpu 类型的文件夹拷进去;如果将 so 文件添加在 module的libs 文件夹下,注意在 module 的 gradle 配置中添加一下配置:sourceSets.main.jniLibs.srcDirs = ['libs']
这时候在项目工程中就可以看到多了一个 “jniLibs” 文件夹
导入res资源文件:
找到解压后的 jpush-android-3.1.7-release—>example—>res,复制 res/ 中 drawable-hdpi, layout, values 文件夹中的资源文件到你的工程中 res/ 对应同名的目录下。
如果是项目开发中后期集成,难免会跟自己的项目资源文件有更多同名的,自己视情况是否替换、修改、追加。作为一个开发者应该很简单,不要急躁!
【如我项目初期的操作:
drawable-hdpi文件夹: 一般只有 ic_launcher.png 同名,我不复制过去
layout文件夹: 一般不会同名,都复制过去
values文件夹:
jpush_style.xml复制过去,strings.xml、styles.xml 有同名把内容追加在后面,可以用editplus、sublime Text等编辑器打开,更好查看追加!
】
3.3、配置AndroidManifest.xml文件
配置 AndroidManifest.xml
###官网给出的主要步骤为:
根据 SDK 压缩包里的 AndroidManifest.xml 样例文件,来配置应用程序项目的 AndroidManifest.xml 。
1、复制备注为 “Required” 的部分
2、将标注为“您应用的包名”的部分,替换为当前应用程序的包名
3、将标注为“您应用的 Appkey” 的部分,替换为在 Portal 上创建该应用后应用信息中的 Appkey,例如:9fed5bcb7b9b87413678c407
***###我通过分析,自己的主要步骤为: ***
找到下载解压后的 jpush-android-3.1.7-release—>example—>AndroidManifest.xml,用editplus或sublime文件编辑工具打开,然后开始复制操作:
1、极光的这些代码 不替换自己程序的: manifest标签
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="您应用的包名"
android:versionCode="317"
android:versionName="3.1.7"
>
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="21" />
2、极光的这些代码 不替换自己程序的: application标签程序入口相关
<application
android:icon="@drawable/ic_launcher"
android:allowBackup="false"
android:label="@string/app_name"
android:name="com.example.jpushdemo.ExampleApplication">
3、极光的这些代码 不替换自己程序的:activity标签入口activity主程序
<!-- For test only 测试的主程序-->
<activity
android:name="com.example.jpushdemo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
4、把极光 permission权限 复制进去
<!-- Required -->
<permission
android:name="您应用的包名.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" />
<!-- Required 一些系统要求的权限,如访问网络等-->
<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.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.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Optional for location -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
<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" />
5、把极光 组件注册代码 复制进去
<!-- For test only 测试高级功能 -->
<activity android:name="com.example.jpushdemo.PushSetActivity" android:label="@string/app_name"></activity>
<!-- For test only 测试设置 -->
<activity android:name="com.example.jpushdemo.SettingActivity" android:label="@string/app_name"></activity>
<!-- For test only 测试状态通知栏,需要打开的Activity -->
<activity android:name="com.example.jpushdemo.TestActivity" android:exported="false">
<intent-filter>
<action android:name="jpush.testAction" />
<category android:name="jpush.testCategory" />
</intent-filter>
</activity>
<!-- Rich push 核心功能 since 2.0.6-->
<activity
android:name="cn.jpush.android.ui.PopWinActivity"
android:theme="@style/MyDialogStyle"
android:exported="false">
</activity>
<!-- Required SDK核心功能-->
<activity
android:name="cn.jpush.android.ui.PushActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@android:style/Theme.NoTitleBar"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.ui.PushActivity" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="您应用的包名" />
</intent-filter>
</activity>
<!-- Required SDK 核心功能-->
<!-- 可配置android:process参数将PushService放在其他进程中 -->
<service
android:name="cn.jpush.android.service.PushService"
android:process=":pushcore"
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 3.0.9 Required SDK 核心功能-->
<provider
android:authorities="您应用的包名.DataProvider"
android:name="cn.jpush.android.service.DataProvider"
android:process=":pushcore"
android:exported="false"
/>
<!-- 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>
<!-- since 3.1.0 Required SDK 核心功能-->
<provider
android:authorities="您应用的包名.DownloadProvider"
android:name="cn.jpush.android.service.DownloadProvider"
android:exported="true"
/>
<!-- 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="您应用的包名" />
</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="com.example.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="您应用的包名" />
</intent-filter>
</receiver>
<!-- User defined. For test only 用户自定义接收消息器,3.0.7开始支持,目前新tag/alias接口设置结果会在该广播接收器对应的方法中回调-->
<receiver android:name="com.example.jpushdemo.MyJPushMessageReceiver">
<intent-filter>
<action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<category android:name="您应用的包名"></category>
</intent-filter>
</receiver>
6、把极光 meta-data标签 复制进去
<!-- 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="您应用的Appkey" /> <!-- </>值来自开发者平台取得的AppKey-->
7、搜索“您应用的包名”替换成当前项目主包名
8、找到下载解压后的 jpush-android-3.1.7-release—>example—>src,在自己的项目新建包名“com.example.jpushdemo”
把极光解压后demo中src下里面的java文件全部复制到此包里面
这时候PushSetActivity可能会报错,那是因为引入图片方式还是eclipse时候的方式,极光推送的开发工程师也够懒的没有更新!我们把引入图片“drawable”改成“mipmap”吧!如下:
// builder.addJPushAction(R.drawable.jpush_ic_richpush_actionbar_back, "first", "my_extra1");
builder.addJPushAction(R.mipmap.jpush_ic_richpush_actionbar_back, "first", "my_extra1");
9、添加替换meta-data标签里面的Appkey的值
10、配置混淆文件
在 proguard-rules.pro 文件中加入混淆代码
-dontoptimize
-dontpreverify
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; }
-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }
3.4、代码测试极光推送
11、代码测试极光推送 在自定义的Application中onCreate中调用极光推送的初始化方法public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
JPushInterface.setDebugMode(true); //正式环境时去掉此行代码
JPushInterface.init(this);
}
}
然后在 AndroidManifest.xml 文件中关联MyApplication
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
运行项目基本上不会报错了:
唯一报错的就是AndroidStudio图片引入方式要从
@drawable/ic_launcher 改成 @mipmap/ic_launcher,把你从极光样例程序复制进来的xml文件都改改就可以了!
然后可以去官网,推送测试一下了!
OK,接收成功!