在广播接收器的OnReceive方法中运行长时间运行的任务并获取用户位置

时间:2019-06-25 08:05:04

标签: android flutter

我遇到这样的情况,我的应用必须在指定的时间间隔内从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;
    }

}

0 个答案:

没有答案