mqtt 怎么实现android以后台service的方式获取gps数据,并定时发送到服务器

mqtt 怎么实现android以后台service的方式获取gps数据,并定时发送到服务器,第1张

1 从Service继承一个类。

2 创建startService()方法

3 创建endService()方法 重载onCreate方法和onDestroy方法,并在这两个方法里面来调用startService以及endService。

4 在startService中,通过getSystemService方法获取ContextLOCATION_SERVICE。

5 基于LocationListener实现一个新类。默认将重载四个方法onLocationChanged、onProviderDisabled、onProviderEnabled、onStatusChanged。对于onLocationChanged方法是我们更新最新的GPS数据的方法。一般我们的操作都只需要在这里进行处理。

6 调用LocationManager的requestLocationUpdates方法,来定期触发获取GPS数据即可。在onLocationChanged函数里面可以实现我们对得到的经纬度的最终操作。

7 最后在我们的Activity里面通过按钮来启动Service,停止Service。

示意代码如下:

package comoffbyegpsservice;

import androidappService;

import androidcontentContext;

import androidcontentIntent;

import androidlocationLocationListener;

import androidlocationLocationManager;

import androidosBinder;

import androidosIBinder;

import androidutilLog;

public class GPSService extends Service {

// 2000ms

private static final long minTime = 2000;

// 最小变更距离10m

private static final float minDistance = 10;

String tag = thistoString();

private LocationManager locationManager;

private LocationListener locationListener;

private final IBinder mBinder = new GPSServiceBinder();

public void startService() {

locationManager = (LocationManager) getSystemService(ContextLOCATION_SERVICE);

locationListener = new GPSServiceListener();

locationManagerrequestLocationUpdates(LocationManagerGPS_PROVIDER, minTime, minDistance,

locationListener);

}

public void endService() {

if (locationManager != null && locationListener != null) {

locationManagerremoveUpdates(locationListener);

}

}

@Override

public IBinder onBind(Intent arg0) {

// TODO Auto-generated method stub

return mBinder;

}

Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要的任务。而一些安全软件,会有结束进程的功能,如果不做Service的保持,就会被其杀掉。

如何保持Service的运行,其核心就是利用ANDROID的系统广播,这一不会被其他软件影响的常驻程序触发自己的程序检查Service的运行状态,如果被杀掉,就再起来。

利用的系统广播是IntentACTION_TIME_TICK,这个广播每分钟发送一次,可以每分钟检查一次Service的运行状态,如果已经被结束了,就重新启动Service。

下边就是具体的代码和注意事项了:

1、 IntentACTION_TIME_TICK的使用

开发人员知道广播的注册有静态注册和动态注册,但此系统广播只能通过动态注册的方式使用。即不能通过在manifestxml里注册的方式接收到这个广播,只能在代码里通过registerReceiver()方法注册。

在ThisApp extends Application 里注册广播:

IntentFilter filter = newIntentFilter(IntentACTION_TIME_TICK);

MyBroadcastReceiver receiver = new MyBroadcastReceiver();

registerReceiver(receiver, filter);

在广播接收器MyBroadcastReceiver extends BroadcastReceiver的onReceive里

if (intentgetAction()equals(IntentACTION_TIME_TICK)) { //检查Service状态 }

2、Service的检查与启动

boolean isServiceRunning = false;

ActivityManager manager = (ActivityManager)ThisAppgetContext()getSystemService(ContextACTIVITY_SERVICE);

for (RunningServiceInfo service :managergetRunningServices(IntegerMAX_VALUE))

{

if("soxxxxWidgetUpdateService"equals(serviceservicegetClassName()))

//Service的类名

{ isServiceRunning = true; }

}

if (!isServiceRunning) {

Intent i = new Intent(context, WidgetUpdateServiceclass);

contextstartService(i);

}

关于Service的开机启动。

实现和上边的类似,也是通过监控开机的系统广播来启动Service。但其实做了上边的检查也就不会做开机启动了,因为过一两分钟就会通过上边的程序启动Service了。代码如下:

if (intentgetAction()equals(IntentACTION_BOOT_COMPLETED))

{

Intent i = new Intent(context, LogServiceclass);

contextstartService(i);

}

可使用android自带的httpclient框架,向后台发起请求,获取数据。\x0d\\x0d\1 GET 方式传递参数\x0d\//先将参数放入List,再对参数进行URL编码\x0d\List params = new LinkedList();\x0d\paramsadd(new BasicNameValuePair("param1", "数据")); //增加参数1\x0d\paramsadd(new BasicNameValuePair("param2", "value2"));//增加参数2\x0d\String param = URLEncodedUtilsformat(params, "UTF-8");//对参数编码\x0d\String baseUrl = "服务器接口完整URL";\x0d\HttpGet getMethod = new HttpGet(baseUrl + "" + param);//将URL与参数拼接\x0d\HttpClient httpClient = new DefaultHttpClient();\x0d\try {\x0d\ HttpResponse response = httpClientexecute(getMethod); //发起GET请求\x0d\ Logi(TAG, "resCode = " + responsegetStatusLine()getStatusCode()); //获取响应码\x0d\ Logi(TAG, "result = " + EntityUtilstoString(responsegetEntity(), "utf-8"));//获取服务器响应内容\x0d\} catch (ClientProtocolException e) {\x0d\ eprintStackTrace();\x0d\} catch (IOException e) {\x0d\ eprintStackTrace();\x0d\}\x0d\\x0d\2 POST方式 方式传递参数\x0d\//和GET方式一样,先将参数放入List\x0d\params = new LinkedList();\x0d\paramsadd(new BasicNameValuePair("param1", "Post方法"));//增加参数1\x0d\paramsadd(new BasicNameValuePair("param2", "第二个参数"));//增加参数2\x0d\try {\x0d\ HttpPost postMethod = new HttpPost(baseUrl);//创建一个post请求\x0d\ postMethodsetEntity(new UrlEncodedFormEntity(params, "utf-8")); //将参数填入POST Entity中\x0d\ HttpResponse response = httpClientexecute(postMethod); //执行POST方法\x0d\ Logi(TAG, "resCode = " + responsegetStatusLine()getStatusCode()); //获取响应码\x0d\ Logi(TAG, "result = " + EntityUtilstoString(responsegetEntity(), "utf-8")); //获取响应内容\x0d\} catch (UnsupportedEncodingException e) {\x0d\ eprintStackTrace();\x0d\} catch (ClientProtocolException e) {\x0d\ eprintStackTrace();\x0d\} catch (IOException e) {\x0d\ eprintStackTrace();\x0d\}

后端运行在区块链上 。

定义 :DApp是Decentralized Application的缩写,中文名叫去中心化应用,去中心化主要是因为它是把核心逻辑和数据放在区块链上的应用。 特征: (1)后端运行在区块链上:从系统结构的角度看,DApp的后端运行在去中心化的点对点网络上,传统互联网应用的后端运行在中心化的服务器上。 (2)核心逻辑或者数据上链:应用的数据必须加密后存储在公开的区块链上。 (3)无中心化控制:该应用必须能够根据用户的反馈及技术要求进行升级,且应用升级必须由大部分用户达成共识之后方可进行。 (4)应用开源:一个真正的DApp应用必须完全开源。

一、前端开发

前端开发主要涉及网站和 App,用户能够从浏览器上或 App 屏幕上看到的东西。简单地说,能够从浏览器上或 App 屏幕看到的东西都属于前端。

1、技能与工具

前端开发,就是要创造上面提到的网站面向用户的部分背后的代码,并通过建立框架,构建沉浸性的用户体验。为了实现这个目标,开发需要熟练运用下列语言、框架、工具库:

三大语言:HTML,CSS,和 Javascript;

此外,掌握 jQuery 和 LESS 等工具库也很重要,它们能帮助开发者以更高效的方式编码;

很多前端开发岗也要求 Ajax 方法的使用经验,它可以帮助你使用 Javascript 在后台从服务器拉取数据,协助实现页面的动态加载。

使用这些技术,前端开发者能连接起网站设计者和后端开发者之间的桥梁。他们能提供用户体验方面的分析,构建模型和线框,给设计团队提出建议。他们能给后端编写的服务应用赋予生命,提升格调,营造美感。

二、后端开发

后端开发即“服务器端”开发,主要涉及软件系统”后端“的东西。比如,用于托管网站和 App 数据的服务器、放置在后端服务器与浏览器及 App 之间的中间件,它们都属于后端。简单地说,那些你在屏幕上看不到但又被用来为前端提供支持的东西就是后端。

1、技能与工具

为了让服务器、应用、数据库能够彼此交互,后端工程师需要具有如下技能:

用于应用构建的服务器端语言:PHP,Ruby,Python,Java,Net 等;

数据相关工具:MySQL,Oracle,SQL Server 等;

PHP框架:Zend,Symfony,CakePHP等;

版本控制工具:SVN,CVS,Git 等;

还要熟练使用 Linux 作为开发和部署环境。

后端开发者使用这些工具编写干净、可移植、具有良好文档支持的代码来创建或更新 Web 应用。但在写代码之前,他们需要与客户沟通,了解其实际需求并转化为技术目标,制定最有效且精简的方案来进行实现。

作者:闭关写代码

链接:https://wwwzhihucom/question/29826231/answer/71207109

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

强烈建议不要这么做,不仅仅从用户角度考虑,作为Android开发者也有责任去维护Android的生态环境。现在很多Android开发工程师,主力机居然是iPhone而不是Android设备,感到相当悲哀。

从技术角度概括一下现在普遍的防杀方法

Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样

通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 kill

双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程

QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死

在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android40系列的一个漏洞,已经确认可行)

Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android50以下可行)

用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。

在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。

主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。

联系厂商,加入白名单

------------------------------------------------------

TIP: 面对各种流氓软件后台常驻问题,建议使用“绿色守护”来解决,可是杀掉那些第三方清理工具难以清除的后台程序

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » mqtt 怎么实现android以后台service的方式获取gps数据,并定时发送到服务器

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情