android 保证屏幕黑屏之后线程可以继续运行

本文介绍了一种在Android手机上实现GPS定时定位的方法,即使在屏幕关闭的情况下也能持续上传位置信息。通过使用Service和PowerManager.WakeLock保持CPU活跃,确保后台定位服务正常运行。

最近在做关于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 {

	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();
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值