mqtt 怎么实现android以后台service的方式获取gps数据,并定时发送到服务器
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: 面对各种流氓软件后台常驻问题,建议使用“绿色守护”来解决,可是杀掉那些第三方清理工具难以清除的后台程序
0条评论