我想是因为我这个标题取得不好吧。。。什么哀怨情仇,第一次保存就没保存好,整个下午的努力全部都泡紫菜蛋汤去了然后就真的有哀怨情仇了,后面又花了一个下午再把它补齐了,点击保存编辑的那一刻,心扑通扑通跳,还好他现在对我只有情没有仇了,终于保存成功了
##写在前面
极光推送这么好的东西,简单几步就能集成推送的牛逼闪闪的功能,今天我就来说说怎么从0到1来集成极光推送。PS:今天刚看了Markdown语法的神奇功效,怎么能不好好来一发--->那么拿起键盘搞起吧~
###step1 创建HelloJpush
我们界面就这样吧~从官方那边做一个推送一个消息过来,这边收到信息的话就显示出来,也可以做通知栏消息,界面就这样先
###step2 Jpush主页上面创建应用
当然没有账号的。。。什么你没有账号?
好吧好吧,既然是从0到1那我们就去搞个账号=> 地址戳我
我真发现这注册页面美美哒,不信你看
注册也是简单到没啥了,那你就按着这个顺序一步步填下去,我就不手把手教你填信息啦
step3 项目集成
注册完不知道从何下手,唯一参考依据就是文档开起来啦~~
==>听说你找我??
#####项目集成1 添加应用
好奇宝宝的你打开是不是就点进去3分钟集成Demo啦
没错就想看看她的庐山真面目,一进来他就教我们怎么创建应用啦~
应用管理这边新建一个应用
填入应用名再选一个美美哒的图标上传进去,再填入我们大安卓的包名就可以啦,点击就会新建一个应用
我这边的就是酱紫啦~appkey是个重要的东东,待会会用到
#####项目集成2 添加jar包和so库
看项目集成指南,里面有两种集成方法
使用AndroidStudio的童鞋可以使用jcenter的自动集成步骤,复制黏贴代码~~
好的~~本集完~~
话说酱紫我整篇就没啥内容啦EC的童鞋表示WTF
好啦好啦,那我们就自己动手来搞一搞,不用jcenter
首先去下载官方给的jar包===>召唤神龙
下载完解压缩拿到lib里面的jar包和各版本的so库
然后打开将jar库放到libs目录下,建议 将so库放在jniLibs目录下
一般直接建一个应用是木有jniLibs库的,我是这么给它创建的
在src/main目录下与java同级的目录新建一个jniLibs文件夹,返回到AS目录里面就能看到jniLibs目录,将所有的so库连同它的文件夹考到jniLibs目录下
这样做的好处是你不需要在gradle里面额外配置so库的路径,不然就得这么干,在android{}节点下配置
sourceSets{
main{
jniLibs.srcDirs=['libs']
}
}
基础库配置完顺便配置以下混淆,一般企业级项目都会配置混淆,我们的原则也是每添加一个库就配置对应的混淆,不然等整个项目都结束了才来配置混淆你不知道自己都添加了哪些,哪些应该配置混淆,不要问我是怎么知道的。。。。。
-dontoptimize
-dontpreverify
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }
使用了Gson顺便配置下Gson
#==================gson && protobuf==========================
-dontwarn com.google.**
-keep class com.google.gson.** {*;}
-keep class com.google.protobuf.** {*;}
#####项目集成3 清单文件的配置
清单文件的配置分三块
- 权限的配置
权限要配置以下几项(Require为必须)<!-- 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.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" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- Optional. Required for location feature --> <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" />
- 一些Service和Reciver的配置
<!-- 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" > <intent-filter android:priority="1000"> <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <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核心功能--> <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="${applicationId}" /> </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" /> <!-- User defined. 用户自定义的广播接收器--> <receiver android:name=".youReceiver" android:enabled="true"> <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="${applicationId}" /> </intent-filter> </receiver>
- appkey的配置
<!-- 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="youkey"/>
一些注意的事项
以上Require的均是必须,Optional为可选的
有一个特别注意下
这个用户自定义的广播一般也是一定要配置的,用来接收服务端的推送,然后根据推送类型,app内部做相应的操作相应
这个需要用户自定义,怎么做呢
先新建一个类,继承BrocastReceiver,重新onReceiver方法,
public class MyJpush extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
intent.setAction("jpush");
//此处就是推送过来的消息接收到的地方
Bundle bundle = intent.getExtras();
String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
}
}
此处就是当收到服务端推送的消息时这边就会做出相应,我们就可以根据消息类型进行相对应的操作
然后把这个Receiver配置到清单文件的用户自定义的Receiver下
<receiver
android:name=".MyPush"
android:enabled="true">
<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="${applicationId}" />
</intent-filter>
</receiver>
#####项目集成4 初始化JPush
配置完清单文件就开始初始化推送了
官方文档说
所以一切从JPushInterface开始
init在整个项目里面只需要调用一次,全局有效,所以我们能想到的就是Application了,自定义一个App集成Application,在onCreat方法里面进行初始化
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
JPushInterface.init(this);
JPushInterface.setDebugMode(true);
}
}
然后将它配置到清单文件的Application的name属性里
然后,运行看看??
首次初始化,log日志为info级别的会输出初始化成功,并返回appkey~由于我这个已经不是第一次初始化了,就截不了图了
#####项目集成5 开始推送了
那我们就去推个消息过来看看??
当然不行,推送成功我们并没有对推送消息做任何处理,即使成功了我们也并不知道,所以呢,就要对我们自定义的Receiver做处理了
刚才我们已经自定义了一个MyJPush,并且配置到清单文件里了,我们要处理的对象就是MyJPush的onReceiver里面,那怎么处理呢?
文档文档你在哪??
就是它了,一切从intent下手,intent的bundle里面藏了我们所需要的消息,一般我们项目里的做法就是通过拿到消息里面内容进行解析,根据解析得到的内容再指定app做什么操作,推送的消息看大伙的服务端的小伙伴怎么做的了,我们这边就做一个消息的演示,至于比如推送JSon这个高级的东东就留给大伙自己去玩啦。
那我们来玩一下,我们就从JPush的官方推送一个自定义消息过来,app获取到消息后就显示到主页面上面
那在自定义Receiver(我的项目是MyJpush)的onReceiver方法里面拿到message并且发送个广播让主页面的MainActivity接收到然后显示
Bundle bundle = intent.getExtras();
String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
if (!TextUtils.isEmpty(message)){
Log.e("MyJpush", "message = " + message);
Intent intent1 = new Intent("jpush");
intent1.putExtra("message",message);
context.sendBroadcast(intent1);
}
在MainActivity的onCreate方法里面
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("message");
tvResult.setText(message);
}
}, new IntentFilter("jpush"));
玩起来~
是不是有人会问我为什么你不直接让MainActivity继承BrocastReceive,重写OnReceiver,把这个MainActivity配置到清单文件里面不就好了??
当然可以,这对我们一个示例来说简单易实现,可是我们一般的项目中都不建议这么做,因为要处理的业务逻辑千千万,所以我这边也是写一个通用的方法,让大家看着也顺眼一些
JPush进阶 使用alia做个别推送
就是这个,使用它可以针对个别用户做推送,一般我们项目中呢就使用用户的id做别名就好了,我们自己的简单示例木有id,所以我们就自己定义一个字符串当别名好了。
设置别名的方法是JPushInterfaced的setAlias,我们调用此方法做一个别名的设置
JPushInterface.setAlias(this, "alia1", new TagAliasCallback() {
@Override
public void gotResult(int i, String s, Set<String> set) {
if (i == 0) {
//设置成功
}
}
});
注意 要返回的code==0才算设置成功,
如果不成功怎么办呢?===>找我找我
那我们再来试一下??
左边设置的alia=“alia1”,右边设置的alia = “alia2”,极光推送推起来~~
设置别名就
别名不存在的话是推送不出去的,当然要客户端别名设置成功了这边才会有这个别名,否则别名是不存在的
左边的有显示,右边没动静
再来一个
左边没变,右边收到消息了~~
好吧,那就这样子了~~
##总结
总结下整个过程
- 注册账号,并且在JPush后台创建应用
- 配置环境可以使用jcenter自动配置,也可以使用手动配置
- 手动配置需要下载jar包和so库进行配置,注意so库的文件放置路径
- 配置清单文件,先配置权限,然后配置service和receiver,最后配置appkey
- 自定义Receiver,继承 BroadcastReceiver并重写onReceiver方法,此方法在接收到消息会会有响应
- 初始化Jpush,在App里面操作
- 拿出推送来的消息,显示到页面
#完
0条评论