android 后台运行service实现和后台的持续交互
在项目中有这么一种需求
需要后台开启服务,时刻记录用户和软件的交互行为,一旦交互发生,就向服务器测发送一条消息
解决方案:
一、创建一个service服务类
在service中开启一个线程,service类具有一个记录消息队列的成员变量,在service的oncreate方法中开启一个循环,检测此队列,如果队列中存在消息即发送,并在发送之后删除此消息,代码如下:
package com.test.remotecontroller.services;import java.util.LinkedList; import java.util.Queue;import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder;import com.google.gson.Gson; import com.test.remotecontroller.entity.Behavior; import com.test.remotecontroller.entity.NewBehavior; import com.wotlab.home.moneyplantairs.web.SendRequest;public class SendBehaviorService extends Service {private MyBinder mBinder = new MyBinder();private Queue<NewBehavior> queue = new LinkedList<NewBehavior>();private Thread thread = null;private boolean flag = true;private Gson gson = new Gson();@Overridepublic IBinder onBind(Intent intent) {return mBinder;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Overridepublic void onCreate() {thread = new Thread(new Runnable() {@Overridepublic void run() {while (flag) {NewBehavior item = queue.peek();try {if (item != null) {item.setDefaultEmpty();if (SendRequest.Send(gson.toJson(item)))queue.remove(item);elsethread.sleep(5000);} else {thread.sleep(1000);}} catch (Exception e) {e.printStackTrace();}}}});thread.start();}@Overridepublic void onDestroy() {flag = false;super.onDestroy();}public boolean insertItem(NewBehavior item) {return queue.offer(item);}public class MyBinder extends Binder {public SendBehaviorService getService() {return SendBehaviorService.this;}}}
二、关于该service的启动
service的启动有两种方法,具体可以参照service的生命周期描述
(1)通过context的startService(intent)方法,这种方法的执行周期是onCreate(仅仅执行一次)——>onStartCommand(每次调用startService方法都可以执行)——>(如果手工调用stopService(intent)方法,那么——>onDestroy()方法,否则该service将一直运行)。service没有onPause,onResume等生命周期
(2)通过context的bindService(intent,conn,Service.BIND_AUTO_CREATE)方法,此时执行的生命周期是onCreate(仅仅执行一次)——>onBind()(仅仅执行一次)——>(如果调用unbindService(conn)方法,那么执行onUnbind()方法,之后自动调用onDestroy方法)。使用这种方法service可以和前台进行通信
(3)一种特殊的情况是,如果某个service之前已经由某个客户端通过startService启动了,那么之后其他客户端通过bindservice()方法调用,再调用unbind()方法,最后又嗲用了bindService()方法
那么执行的生命周期方法是
onCreate()——>onStart()——>onBind()——>onUnbind()[重写该方法 的时候返回了true]——>onRebind();
在自己的项目中,是使用bind方法使用该service(自己的疑问,gaiservice的生命周期应当是程序级别的,这样和activity绑定,其生命周期岂不是手activity生命周期影响了么?)
package com.test.remotecontroller;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List;import android.app.Activity; import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.Toast;import com.test.remotecontroler.R; import com.test.remotecontroller.entity.Device; import com.test.remotecontroller.entity.Sensor; import com.test.remotecontroller.handler.DiscoverTask; import com.test.remotecontroller.handler.ReceiveTask; import com.test.remotecontroller.handler.SearchTask; import com.test.remotecontroller.services.SendBehaviorService; import com.test.remotecontroller.services.SendBehaviorService.MyBinder; import com.wotlab.home.moneyplantairs.utils.IsWifi; import com.wotlab.home.moneyplantairs.utils.MyDeviceListAdapter; import com.wotlab.home.moneyplantairs.utils.TaskCallBack; import com.wotlab.home.moneyplantairs.utils.WiFiUtils;/*** 设备列表页面* * @author lx* */ public class DeviceListActivity extends Activity {public static MyBinder binder = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_device_list);bindService(new Intent(this, SendBehaviorService.class), conn,Context.BIND_AUTO_CREATE);}private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {binder = (MyBinder) service;}};/**@Overrideprotected void onDestroy() {//不晓得为啥这里不是unbind方法stopService(new Intent(this, SendBehaviorService.class));super.onDestroy();}}
android 后台运行service实现和后台的持续交互相关推荐
- android 无法后台运行,安卓模拟器无法后台?
怎么才能实现安卓模拟器后台绑定运行脚本?试过各个安卓模拟器,逍遥,蓝叠,鹦鹉,腾讯助手,试过各种绑定模式,没有一个可以绑定成功.难道安卓模拟器就不能绑定后台运行脚本? 程序如下: PutAttachm ...
- oppo手机android系统进程,OPPO手机应用软件怎么在后台运行?OPPO软件后台运行两种方法...
明明按了Home键让APP在后台运行,结果再进来时,却回不了原先的界面,相当于重新启动了APP!相信不少小伙伴都遇到过这种情况,对于杀怪杀到一半的孩纸,更是痛彻心扉-- 要解决问题很简单,这里有两种方 ...
- 【Linux】nohup后台运行 关闭ssh 后 后台程序停止
文章目录 1.概述 1.概述 在跑时间比较长的程序,或者打印信息比较多,或者网络不稳定时,可以采用后台运行程序,然后把打印信息保存在文件中,等程序结束后再检查日志,完成该功能可以用以下命令 nohup ...
- 阿里云后台运行python程序(后台运行scrapy爬虫)的方法
1. 问题引入 通过Xshell工具连接远程阿里云服务器后,如何运行python程序呢?这个大家都知道,python命令啦. 举个栗子:通过Xshell在某个目录下输入命令:python test.p ...
- centos - 查看程序运行状态、后台运行程序、回调后台程序、监控(tomcat和java程序为例)
# 线程 查看进程是否启动 https://blog.csdn.net/dongruanlong/article/details/83027737 ps -ef|grep java 或者 ps -au ...
- Android长时间后台运行Service
项目需要在后台获取GPS经纬度.当用户对手机有一段时间没有操作后,屏幕(Screen)将从高亮(Bright)变为暗淡(Dim),如果再过段时间没操作, 屏幕(Screen)将又由暗淡(Dim)变为不 ...
- 《转载》IOS高级开发~开机启动无限后台运行监听进程
非越狱情况下实现: 开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动: 无限后台运行:应用进入后台状态,可以无限后台运行,不被系统kill: 监听 ...
- linux后台运行cat命令,Linux程序前台后台切换
Linux程序前台后台切换1.在Linux终端运行命令的时候,在命令末尾加上 & 符号,就可以让程序在后台运行Ubuntu$">root@Ubuntu$ ./tcpserv01 ...
- linux后台运行python脚本
&符号 这两天要在一直运行一个Python脚本,当然就想到了在命令后面加&符号 $ python /data/python/server.py >python.log & ...
最新文章
- c语言中合法的字符型常量是,C语言习题库(带答案)-排版.doc
- 计算机组成实验六MIPS汇编器,杭电计组实验6-MIPS汇编器与模拟器实验.doc
- Maven的pom报错的解决方法
- 结构光双目视觉测距原理
- 查看是否安装显卡驱动,查看可以使用的驱动版本
- 面试必问题:JS防抖与节流
- bcp: 给boost瘦身
- 2038年问题 php,php strtotime() mktime() 的2038年问题 Y2K38漏洞
- JDY-24M 超级 BLE 蓝牙模块——理解与实践
- 游戏辅助,python制作王者荣耀刷金币脚本!
- python 集合的基本操作
- Volatile底层实现原理
- IBM PureApplication System中的硬件之旅:第二代
- MDK 出现#68-D: integer conversion resulted in a change of sign
- 展望下未来的计算机400字,展望未来的作文400字
- Android 2.2模拟器调出中文输入法
- 线性表操作(线性表)
- 树莓派新手入门:烧录系统、换源、基础配置、putty或vnc远程连接
- oracle 下bdump占用大,【学习笔记】Oracle oradebug 利用oradebug释放被删除文件空间的案例...
- Erroe:ESS-07311 FaultCode=Couldn't create SOAP message due to exception: XML reader error;
热门文章
- MYSQL:过滤数据
- PCB各种表面工艺差异说明
- 炼石白小勇:合规与实战推动密码产业发展
- cf Educational Codeforces Round 54 C. Meme Problem
- 剖析SPDK读写NVMe盘过程--从hello_world开始
- 南京审计大学计算机考研专业课答案
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 (高斯消元)
- 使用Adobe Illustrate进行科研论文图片排版
- awesome-face-anti-spoofing
- 网易云音乐打卡2.0(一天300首)10级指日可待