在项目中有这么一种需求

需要后台开启服务,时刻记录用户和软件的交互行为,一旦交互发生,就向服务器测发送一条消息

解决方案:

一、创建一个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实现和后台的持续交互相关推荐

  1. android 无法后台运行,安卓模拟器无法后台?

    怎么才能实现安卓模拟器后台绑定运行脚本?试过各个安卓模拟器,逍遥,蓝叠,鹦鹉,腾讯助手,试过各种绑定模式,没有一个可以绑定成功.难道安卓模拟器就不能绑定后台运行脚本? 程序如下: PutAttachm ...

  2. oppo手机android系统进程,OPPO手机应用软件怎么在后台运行?OPPO软件后台运行两种方法...

    明明按了Home键让APP在后台运行,结果再进来时,却回不了原先的界面,相当于重新启动了APP!相信不少小伙伴都遇到过这种情况,对于杀怪杀到一半的孩纸,更是痛彻心扉-- 要解决问题很简单,这里有两种方 ...

  3. 【Linux】nohup后台运行 关闭ssh 后 后台程序停止

    文章目录 1.概述 1.概述 在跑时间比较长的程序,或者打印信息比较多,或者网络不稳定时,可以采用后台运行程序,然后把打印信息保存在文件中,等程序结束后再检查日志,完成该功能可以用以下命令 nohup ...

  4. 阿里云后台运行python程序(后台运行scrapy爬虫)的方法

    1. 问题引入 通过Xshell工具连接远程阿里云服务器后,如何运行python程序呢?这个大家都知道,python命令啦. 举个栗子:通过Xshell在某个目录下输入命令:python test.p ...

  5. centos - 查看程序运行状态、后台运行程序、回调后台程序、监控(tomcat和java程序为例)

    # 线程 查看进程是否启动 https://blog.csdn.net/dongruanlong/article/details/83027737 ps -ef|grep java 或者 ps -au ...

  6. Android长时间后台运行Service

    项目需要在后台获取GPS经纬度.当用户对手机有一段时间没有操作后,屏幕(Screen)将从高亮(Bright)变为暗淡(Dim),如果再过段时间没操作, 屏幕(Screen)将又由暗淡(Dim)变为不 ...

  7. 《转载》IOS高级开发~开机启动无限后台运行监听进程

    非越狱情况下实现: 开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动: 无限后台运行:应用进入后台状态,可以无限后台运行,不被系统kill: 监听 ...

  8. linux后台运行cat命令,Linux程序前台后台切换

    Linux程序前台后台切换1.在Linux终端运行命令的时候,在命令末尾加上 & 符号,就可以让程序在后台运行Ubuntu$">root@Ubuntu$ ./tcpserv01 ...

  9. linux后台运行python脚本

    &符号 这两天要在一直运行一个Python脚本,当然就想到了在命令后面加&符号 $ python /data/python/server.py >python.log & ...

最新文章

  1. c语言中合法的字符型常量是,C语言习题库(带答案)-排版.doc
  2. 计算机组成实验六MIPS汇编器,杭电计组实验6-MIPS汇编器与模拟器实验.doc
  3. Maven的pom报错的解决方法
  4. 结构光双目视觉测距原理
  5. 查看是否安装显卡驱动,查看可以使用的驱动版本
  6. 面试必问题:JS防抖与节流
  7. bcp: 给boost瘦身
  8. 2038年问题 php,php strtotime() mktime() 的2038年问题 Y2K38漏洞
  9. JDY-24M 超级 BLE 蓝牙模块——理解与实践
  10. 游戏辅助,python制作王者荣耀刷金币脚本!
  11. python 集合的基本操作
  12. Volatile底层实现原理
  13. IBM PureApplication System中的硬件之旅:第二代
  14. MDK 出现#68-D: integer conversion resulted in a change of sign
  15. 展望下未来的计算机400字,展望未来的作文400字
  16. Android 2.2模拟器调出中文输入法
  17. 线性表操作(线性表)
  18. 树莓派新手入门:烧录系统、换源、基础配置、putty或vnc远程连接
  19. oracle 下bdump占用大,【学习笔记】Oracle oradebug 利用oradebug释放被删除文件空间的案例...
  20. Erroe:ESS-07311 FaultCode=Couldn't create SOAP message due to exception: XML reader error;

热门文章

  1. MYSQL:过滤数据
  2. PCB各种表面工艺差异说明
  3. 炼石白小勇:合规与实战推动密码产业发展
  4. cf Educational Codeforces Round 54 C. Meme Problem
  5. 剖析SPDK读写NVMe盘过程--从hello_world开始
  6. 南京审计大学计算机考研专业课答案
  7. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 (高斯消元)
  8. 使用Adobe Illustrate进行科研论文图片排版
  9. awesome-face-anti-spoofing
  10. 网易云音乐打卡2.0(一天300首)10级指日可待