как получить значение широты и долготы в сервисе BroadcastReceiver? - PullRequest
0 голосов
/ 08 июня 2019

Итак, я создал приложение, которое будет запускаться, если кнопка питания телефона нажата 5 раз, когда приложение выполнит что-то вроде открытого URL-адреса в фоновом режиме.Теперь проблема в том, что я хочу извлечь значения широты и долготы за это время.код

Класс LockService

public class LockService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_USER_PRESENT);
        final BroadcastReceiver mReceiver = new ScreenReceiver();
        registerReceiver(mReceiver, filter);
        return super.onStartCommand(intent, flags, startId);
    }
    public class LocalBinder extends Binder {
        LockService getService() {
            return LockService.this;
        }
    }
}

ScreenReceiver

public class ScreenReceiver extends BroadcastReceiver {

    LocationManager locationManager;
    static int countPoweroff =0;

    public static boolean wasScreenOn = true;
    int lol;
    @Override
    public void onReceive(final Context context, final Intent intent) {

        Log.e("LOB","onReceive");
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            // do whatever you need to do here

            wasScreenOn = false;
            countPoweroff++;
            Log.e("LOB",""+countPoweroff);
            Log.e("LOB","wasScreenOn"+wasScreenOn);
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            // and do whatever you need to do here
            if (countPoweroff == 3){
                Log.e("LOB","userpresent");
                Log.e("LOB","wasScreenOn"+wasScreenOn);
                String url = "http://www.stackoverflow.com";
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.setData(Uri.parse(url));
                context.startActivity(i);

                Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    vibrator.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
                } else {
                    //deprecated in API 26
                    vibrator.vibrate(500);
                }
                countPoweroff =0;

            }
            wasScreenOn = true;

        }else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)){




        }
    }

Запуск службы в основной деятельности

startService(new Intent(getApplicationContext(), LockService.class));

Я использовал базовый код Locationmanager восновное действие, которое работает только тогда, когда оно открыто.

1 Ответ

0 голосов
/ 08 июня 2019

Любой код, который вы вводите в действие, конечно, будет выполняться только во время выполнения действия.Если ваш менеджер местоположений находится в действии, а действие не выполняется, то вы не можете получить местоположение.Ваш автобус никуда не двинется, когда водитель выключил двигатель и отправился на обеденный перерыв.Делать что-либо, что не связано с Ux в деятельности, - плохой дизайн.Я не знаю деталей вашей реализации, поэтому сложно сказать что-либо еще. Вы должны внедрить диспетчер местоположения в сервис и отправить результат в действие, используя Callable или CompletableFuture.

...