我遇到这样的情况,我的应用必须在指定的时间间隔内从LocationManager
获取用户位置。我以前将Services与Location Listener一起使用并获取位置。但是由于MI,EMIUI等ROM的限制,我无法使用Service并在后台运行。还有一个用例是,我需要按照严格的时间表运行,为此我使用了AlarmManager
并触发了广播。在onReceive
方法中,我使用位置侦听器并启动并运行了2分钟的超时机制。如果该位置在onLocation
方法中可用,它将记录并关闭所有处理程序和侦听器,如果发生超时,则将重置并记录为空。屏幕打开且操作快速时,会发生这种情况。有时我看不到空日志。谁能向我解释原因并提出解决方案?
这是我从Receiver调用的异步任务的代码示例,实际的代码与此非常相似:
import android.annotation.TargetApi;
import android.content.Context;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Build;
import android.util.Log;
import java.util.Calendar;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
@TargetApi(Build.VERSION_CODES.CUPCAKE)
public class AsyncTest extends AsyncTask<String, Void, Void> {
private Timer timer;
private TimerTask timerTask;
private Location currentLocation;
private DBHelper helper;
private Context context;
public AsyncTest(Context context) {
this.context = context;
}
@Override
protected Void doInBackground(String... params) {
helper = new DBHelper(context);
try {
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
if (currentLocation == null) {
helper.insert(new UserLoc(Calendar.getInstance().getTime().toString(), -1, -1, "Some Mode", "No Location Data"));
Log.d("Timer Timeout", "Success");
}
}
};
timer.schedule(timerTask, 2 * 60 * 1000);
} catch (Exception e) {
helper.insert(new UserLoc(Calendar.getInstance().getTime().toString(), -1, -1, "Some Mode", e.getMessage()));
;
}
return null;
}
}