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 = 1700override fun onBind(arg0: Intent): IBinder? {return null}override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {// 获取tokenthis.token = intent.getStringExtra(\"token\")// 开始设置wsval client = OkHttpClient.Builder().build()// 请求val request = Request.Builder().url(url).build()// wsval 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) {// 创建intentval 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] // 开始设置wsval client = OkHttpClient.Builder().build()// 请求val request = Request.Builder().url(url).build()// wsval 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\' }\")