什么是推送
简单的说,移动端的推送服务就是服务器定时将消息送到给客户端的服务。
要达到这个效果有几种方式(Android端):
1.轮询
客户端每隔一段时间便向服务器发送一次请求,询问是否有新消息,如果有,则服务器将消息发送出来
优点:简单
缺点:轮询的单位时间如果长的话,则没有即时消息的效果,如果短的话,那客户端的压力就会很大,耗电,耗流量
2.SMS
以短信的方式向每个用户发送消息
优点:不需要网络
缺点:成本太高,一条短信一毛钱,一个百万级的APP,一次就是10w,当然,肯定是有折扣的。如果仅需要发送一两条这样的消息的话,还是能接受的,但是如果要每天来个五六条,老板:???????????
3.GCM服务
Google推出的云消息服务,Google Cloud Messaging,以前是C2DM,现在以及被GCM替代了
优点:Google亲儿子,原生,简单
缺点:国内用Google?
4.XMPP协议/MQTT协议
自己搭建一个推送服务
优点:功能强大
缺点:复杂,部署硬件成本高
5.使用第三方推送服务
导入SDK使用第三方的推送服务,比如极光推送,百度云推送,个推等等
优点:稳定,简单,开发成本低
缺点:毕竟用的是别人家的东西,总是有些顾虑的
综上所述,我们选择了使用第三方推送,这篇博客就是介绍其中的极光推送是如何使用的?
首先,打开极光推送的官网https://www.jiguang.cn/push
注册登陆,然后点击SDK下载
下载Android版本,解压,发现里面有这些东西
好了,这个先放一边,然后打开AS,在自己应用的AndroidManifest文件或者gradle文件里找到自己应用的包名
然后回到网页,进入极光推送的App管理界面https://www.jiguang.cn/app/list
在这里将自己的应用创建一下,其实就两个要填的,应用名和包名,图标可选可不选(不选就是默认的Logo)
创建好之后将这个Appkey保存下来
然后就回到之前下载的SDK目录里面,打开libs文件夹,将里面的文件全部复制到AS里面
然后在AS里面将两个Jar包添加依赖
compile files('libs/jcore-android_v1.0.0.jar')
compile files('libs/jpush-android_v3.0.0.jar')
然后再将SDK目录下的res文件夹里的文件全部复制到AS里面来
这里最好一个文件一个文件的复制,以免出现错误(反正我是这么弄的-。-)
在资源都复制好之后要在module的gradle文件下添加几句代码( 要在android大标签里哟)
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
好了,执行完这些后就开始做配置工作的最后一步,将一大堆权限,组件,复制到你应用的AndroidManifest文件里面,记得要将自己的应用包名改上去
这里是权限
<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.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" />
<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" />
这里是组件
组件当然是都要写在application标签里面的,就像平常的Activity一样
<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>
<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>
<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="您应用的包名"/>
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>
<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>
<service android:name="cn.jpush.android.service.DownloadService" android:enabled="true" android:exported="false" >
service>
<receiver android:name="cn.jpush.android.service.AlarmReceiver" />
然后最后还有两行,这也是要写在application标签里面的,这里面的应用的Appkey就是之前在网页创建应用时保存下来的Appkey
"JPUSH_CHANNEL" android:value="developer-default"/>
"JPUSH_APPKEY" android:value="您应用的Appkey"/>
OK
到这一步,整个集成已经完成了,就差最后一步调接口了
在自己应用的自定义Application类的onCreate()方法里面添加两行代码,
一般建议在自定义Application里初始化,当然也可以在主Activity里面进行初始化,
JPushInterface.setDebugMode (true); // 设置开启日志,发布时请关闭日志
JPushInterface.init (this); // 初始化 JPush
不要忘了在最后在AndroidManifest文件中检查一下有没有哪里有遗漏的,比如还有”您应用的包名”没替换啦,比如application标签下忘记写name属性啦
好了,这样客户端就配置好了,接下来就在网页后台发个消息推送试试
进入https://www.jiguang.cn/push/app/这里是你应用的Appkey/push/notification
接下来就简单了,输入信息,选上Android,点击发送~~~~~~~~~~~~
咚咚咚~~
然后你的应用就收到了一条推送通知
这样,极光推送的基本集成就完成了