【文件属性】:
文件名称:Android锁屏无法继续定位问题
文件大小:3KB
文件格式:TXT
更新时间:2022-04-24 10:30:56
Androi
Android锁屏无法继续定位问题
产生问题的原因:
手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会将手机进入休眠状态。此时的服务以及线程等都会停止。
最近就这个问题,阅读了很多代码以及官方文档,下面就说下最近都尝试过的方式,可能其中有些您实现了,我这边没实现,望见谅。本文采用的高德定位。
一、PowerManager.WakeLock
(1)直接强制当前页面cpu运行
private PowerManager pm;
private PowerManager.WakeLock wakeLock;
@Override
public void onCreate() {
super.onCreate();
//创建PowerManager对象
pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
//保持cpu一直运行,不管屏幕是否黑屏
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "CPUKeepRunning");
wakeLock.acquire();
}
@Override
public void onDestroy() {
wakeLock.release();
super.onDestroy();
}
这个写法我表示并没有什么用,并不能强制cpu持续运行。
(2)WakefulBroadcastReceiver
public class WLWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//
String extra = intent.getStringExtra("msg");
Intent serviceIntent = new Intent(context, MyIntentService.class);
serviceIntent.putExtra("msg", extra);
startWakefulService(context, serviceIntent);
}
}
WakefulBroadcastReceiver 内部的原理也是PowerManager,注册广播时8.0的请动态注册,静态没有用。广播注册完了之后,写一个服务用来与广播互动。
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected void onHandleIntent(@Nullable final Intent intent) {
//子线程中执行
Log.i("MyIntentService", "onHandleIntent");
String extra = intent.getStringExtra("msg");
new Thread(new Runnable() {
@Override
public void run() {
LocationUtil.getInstance().startLocation(LocationUtil.NULL, new LocationUtil.OnLocationBack() {
@Override
public void back(AMapLocation aMapLocation, String backString) {
Log.e("定位結果", aMapLocation.getAddress()+"");
定位结果操作,我这边是把定位的时候保存到数据库里面。
}
});
}
}).start();
Log.i("MyIntentService", "onHandleIntent:"+extra);
//调用completeWakefulIntent来释放唤醒锁。
// WLWakefulReceiver.completeWakefulIntent(intent);
}
}
注册