创新实训博客(30)——探索Android开发中的消息推送功能(推送服务模块)
Android Service开发
Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。
服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。
此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。
例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。
前台
前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。即使用户停止与应用的交互,前台服务仍会继续运行。
后台
后台服务执行用户不会直接注意到的操作。例如,如果应用使用某个服务来压缩其存储空间,则此服务通常是后台服务。
绑定
当应用组件通过调用 bindService() 绑定到服务时,服务即处于绑定状态。
绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。
多个组件可同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
PushService具体代码
[code]class PushService : Service() { var token = "" var url = "ws://119.176.92.20:56789/ws/push/ID=blogstorm-app" var count = 1700 override fun onBind(arg0: Intent): IBinder? { return null } override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { // 获取token this.token = intent.getStringExtra("token") // 开始设置ws val client = OkHttpClient.Builder() .build() // 请求 val request = Request.Builder() .url(url) .build() // ws val webSocket = client.newWebSocket(request, object : WebSocketListener() { override fun onMessage(webSocket: WebSocket, text: String) { super.onMessage(webSocket, text) notificationPush(count, text, text, token) count += 1 } }) webSocket.send("{ test: 'test' }") Toast.makeText(this, "服务已经启动", Toast.LENGTH_LONG).show() return START_STICKY } override fun onDestroy() { super.onDestroy() Toast.makeText(this, "服务已经停止", Toast.LENGTH_LONG).show() } // 消息推送 fun notificationPush(id: Int, title: String, content: String, token: String) { // 创建intent val intent = Intent(applicationContext, BlogActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } // pendingIntent设置 intent.putExtra("token", token) intent.putExtra("id", id) val pendingIntent: PendingIntent = PendingIntent.getActivity(applicationContext, id, intent, PendingIntent.FLAG_ONE_SHOT) // 展开式通知 val textStyle = NotificationCompat.BigTextStyle() textStyle.bigText(content) // 具体的通知对象 val builder = NotificationCompat.Builder(applicationContext, "push-channel") .setSmallIcon(R.drawable.ic_notify) .setLargeIcon(BitmapFactory.decodeResource(this.resources, R.drawable.ic_notify)) .setContentTitle(title) .setContentText(content) .setStyle(textStyle) // .setPriority(NotificationCompat.PRIORITY_HIGH) // .setDefaults(Notification.DEFAULT_ALL) .setContentIntent(pendingIntent) .setAutoCancel(true) .setFullScreenIntent(pendingIntent,false) // 显示通知 with(NotificationManagerCompat.from(applicationContext)) { notify(id, builder.build()) } } }
Okhttp Websocket调用
HTML5 拥有许多引人注目的新特性,WebSocket就是其中之一。WebSocket一向有着 “Web 的 TCP ”之称。通常 WebSocket 都是用于Web的,用于构建实时的 Web 应用。它可以在浏览器和服务器之间提供一个基于 TCP 连接的双向通道。
WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息 ”Upgrade: WebSocket” 表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。
Websocket同样可以用于移动端。尽管移动端 Android/iOS 的本地应用可以直接通过Socket与服务器建立连接,并定义自己的协议来解决 Web 中实时应用创建困难的问题,但 WebSocket 服务通常复用Web的 80 端口,且可以比较方便的基于Web服务器来实现,因而对于某些端口容易被封的网络环境而言,WebSocket 就变得非常有意义。
连接握手
[code] // 开始设置ws val client = OkHttpClient.Builder() .build() // 请求 val request = Request.Builder() .url(url) .build() // ws val webSocket = client.newWebSocket(request, object : WebSocketListener() { override fun onMessage(webSocket: WebSocket, text: String) { super.onMessage(webSocket, text) notificationPush(count, text, text, token) count += 1 } })
数据发送
[code]webSocket.send("{ test: 'test' }")
执行效果
- 创新实训博客(33)——探索Android开发中的消息推送功能(推送服务模块进阶设计)
- 博客系统开发推送第四季----网站框架的搭建及博客模块功能的完善
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
- 创新实训博客(36)——Android端push推送设置和主界面细节优化处理
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
- 基于xmpp openfire smack开发之Android消息推送技术原理分析和实践[4]
- 大连实训之体验android的开发过程(实现部分功能)
- 开发实训10---Android---注册登录功能实现1
- Android消息推送(二)--基于MQTT协议实现的推送功能
- 【Android开发那点破事】消息推送BroadcastReceiver,点击通知打开两次Activity问题
- 基于xmpp openfire smack开发之Android消息推送技术原理分析和实践[4]
- corethink功能模块探索开发(一)根据已有模块推测目录结构
- 使用Google Cloud Messaging (GCM)服务实现Android消息推送
- 【Android开发】如何实现android和服务器长连接呢?推送消息的原理
- 基于xmpp openfire smack开发之Android消息推送技术原理分析和实践[4]
- 基于openfire+smack的Android、消息推送服务
- 如何在App中实现IM功能之三快速实现离线消息推送模块——箭扣科技Arrownock
- Android中使用WebSocket实现群聊和消息推送功能(不使用WebView)
- corethink功能模块探索开发 小记
- android开发之消息推送