android 保证黑屏之后线程可以继续运行
2017-10-26 17:06
381 查看
最近在做关于android手机端gps定时定位的功能,需要每隔几秒钟将gps定位获取的经纬度上传至后台,但是发现某些手机在屏幕黑屏,进入休眠状态后,后台就没有收到定位信息了,后来通过网上查找资料,发现一旦手机在休眠的时候,手机的cpu也休眠了,创建的线程也会sleep,所以为了让手机屏幕黑屏之后,上传线程可以继续运行,就必须保存手机CPU一直处于运行状态,综合网上所查找的资料,发现可以通过使用android的PowerManager和PowerManager.WakeLock这两个类来控制,具体关于这两个类的使用可以参考:http://www.cnblogs.com/keyindex/articles/1819504.html
下面来说一下我的GPS定时定位主要思想:
1、要实现程序退出之后,仍然可以定时上传定位信息,必须采用service,service可以保持在后台一直运行,除非系统资源极其匮乏,否则一般来说service是不会被系统杀死的。
2、要实现定时上传,因为android系统自带的gps定位功能本身自带就有循环定位的功能,所以直接利用此功能即可实现定时上传了。
代码如下所示:
/**
* 获取gps位置信息的service
*
* @author king
*
*/
public class MyService extends Service {
}
下面来说一下我的GPS定时定位主要思想:
1、要实现程序退出之后,仍然可以定时上传定位信息,必须采用service,service可以保持在后台一直运行,除非系统资源极其匮乏,否则一般来说service是不会被系统杀死的。
2、要实现定时上传,因为android系统自带的gps定位功能本身自带就有循环定位的功能,所以直接利用此功能即可实现定时上传了。
代码如下所示:
/**
* 获取gps位置信息的service
*
* @author king
*
*/
public class MyService extends Service {
private LocationManager locationManager; private PowerManager pm; private PowerManager.WakeLock wakeLock; private GPSUploadThread myThread; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); //创建LocationManger对象(LocationMangager,位置管理器。要想操作定位相关设备,必须先定义个LocationManager) locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //利用Criteria选择最优的位置服务 Criteria criteria = new Criteria(); //设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细 criteria.setAccuracy(Criteria.ACCURACY_FINE); //设置是否需要海拔信息 criteria.setAltitudeRequired(false); //设置是否需要方位信息 criteria.setBearingRequired(false); // 设置是否允许运营商收费 criteria.setCostAllowed(true); // 设置对电源的需求 criteria.setPowerRequirement(Criteria.POWER_LOW); //获取最符合要求的provider String provider = locationManager.getBestProvider(criteria, true); //绑定监听,有4个参数 //参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种 //参数2,位置信息更新周期,单位毫秒 //参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息 //参数4,监听 //备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新 locationManager.requestLocationUpdates(provider, 10000, 0,locationListener);// 2000,10 } @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); //创建PowerManager对象 pm = (PowerManager) getSystemService(Context.POWER_SERVICE); //保持cpu一直运行,不管屏幕是否黑屏 wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "CPUKeepRunning"); wakeLock.acquire(); } /** * 实现一个位置变化的监听器 */ private final LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub /** * 此处实现定位上传功能 */ } // 当位置信息不可获取时 @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub /** * */ } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } }; @Override public void onDestroy() { // TODO Auto-generated method stub // toggleGPS(false); if (locationListener != null) { locationManager.removeUpdates(locationListener); } wakeLock.release(); super.onDestroy(); }
}
相关文章推荐
- android 保证屏幕黑屏之后线程可以继续运行
- android 保证屏幕黑屏之后线程可以继续运行
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)
- 如果系统能够保证不在0x000000007fffffff以上的地址分配内存,那么应用程序就能够正常运行。把一个高33位都为0的64位地址截断为32位地址,无论如何都不会产生问题。系统可以提供这一保证,
- Android Runnable 运行在那个线程
- android中子线程可以更新UI,是真的吗?
- android 可执行程序终于可以在nxp8473--cortex-a9平台运行
- Android Studio R文件爆红但是项目可以运行
- android 为什么可以在子线程更新UI
- 判断Android后台服务线程(Service类)是否正在运行
- Android hellochart使用(可以在Eclipse中运行)
- Android 6.0之后,在运行时请求权限,工具类
- Wine On Android将可以在Android上运行Windows程序
- 更新AndroidStudio后,运行原来可以运行的程序时,出现 Error running app: Instant Run requires 'Tools | Android | Enable A
- Android Runnable 运行在那个线程
- 将变量x声明为unsigned类型,可以保证右移时无论程序在什么机器上运行,左边空位都由0填补
- Android Runnable 运行在那个线程
- Android Runnable 运行在那个线程
- Android如何保证一个线程最多只能有一个Looper?
- android权限列表+主线程运行上传异常。