WorkManager нужно работать только в определенный промежуток времени - PullRequest
1 голос
/ 24 мая 2019

Я впервые работаю с Диспетчером работ и успешно его внедрил.

Я каждые 30 минут занимаю местоположение для отслеживания сотрудника.

Я запустил свой Диспетчер работ, когда база данныхсинхронизируется в первый раз, но я хочу остановить его каждый день к вечеру.

Вот MyWorker.java

public class MyWorker extends Worker {

    private static final String TAG = "MyWorker";
    /**
     * The desired interval for location updates. Inexact. Updates may be more or less frequent.
     */
    private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10000;
    /**
     * The fastest rate for active location updates. Updates will never be more frequent
     * than this value.
     */
    private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS =
            UPDATE_INTERVAL_IN_MILLISECONDS / 2;
    /**
     * The current location.
     */
    private Location mLocation;
    /**
     * Provides access to the Fused Location Provider API.
     */
    private FusedLocationProviderClient mFusedLocationClient;

    private Context mContext;

    private String fromRegRegCode, fromRegMobile, fromRegGUID, fromRegImei, clientIP;

    /**
     * Callback for changes in location.
     */
    private LocationCallback mLocationCallback;

    public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
        mContext = context;
    }

    @NonNull
    @Override
    public Result doWork() {
        Log.d(TAG, "doWork: Done");
        //mContext.startService(new Intent(mContext, LocationUpdatesService.class));
        Log.d(TAG, "onStartJob: STARTING JOB..");
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(mContext);

        mLocationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
            }
        };

        LocationRequest mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        try {
            mFusedLocationClient
                    .getLastLocation()
                    .addOnCompleteListener(new OnCompleteListener<Location>() {
                        @Override
                        public void onComplete(@NonNull Task<Location> task) {
                            if (task.isSuccessful() && task.getResult() != null) {
                                mLocation = task.getResult();

                                String currentTime = CommonUses.getDateToStoreInLocation();
                                String mLatitude = String.valueOf(mLocation.getLatitude());
                                String mLongitude = String.valueOf(mLocation.getLongitude());

                                LocationHistoryTable table = new LocationHistoryTable();
                                table.setLatitude(mLatitude);
                                table.setLongitude(mLongitude);
                                table.setUpdateTime(currentTime);
                                table.setIsUploaded(CommonUses.PENDING);

                                LocationHistoryTableDao tableDao = SohamApplication.daoSession.getLocationHistoryTableDao();
                                tableDao.insert(table);

                                Log.d(TAG, "Location : " + mLocation);
                                mFusedLocationClient.removeLocationUpdates(mLocationCallback);

                                /**
                                 * Upload on server if network available
                                 */
                                if (Util.isNetworkAvailable(mContext)) {
                                    checkForServerIsUP();
                                }

                            } else {
                                Log.w(TAG, "Failed to get location.");
                            }
                        }
                    });
        } catch (SecurityException unlikely) {
            Log.e(TAG, "Lost location permission." + unlikely);
        }

        try {
            mFusedLocationClient.requestLocationUpdates(mLocationRequest,
                    null);
        } catch (SecurityException unlikely) {
            //Utils.setRequestingLocationUpdates(this, false);
            Log.e(TAG, "Lost location permission. Could not request updates. " + unlikely);
        }
        return Result.success();
    }
}

Код дляНачальный работник:

PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(MyWorker.class, repeatInterval, TimeUnit.MINUTES)
            .addTag("Location")
            .build();
WorkManager.getInstance().enqueueUniquePeriodicWork("Location", ExistingPeriodicWorkPolicy.REPLACE, periodicWork);

Есть ли какой-нибудь конкретный способ остановить его каждый день вечером?

Ваша помощь будет принята с благодарностью.

Ответы [ 4 ]

2 голосов
/ 24 мая 2019

Вы не можете приостановить PeriodicWorkRequest, и единственный вариант - отменить запрос.

Решение: Лучше добавьте проверку состояния в методе dowork () , если текущее системное время находится в промежутке с 6:00 до 6:00. .

или Вы можете использовать Alarm Manager для запуска службы в указанное время, а затем повторить тревогу в указанный интервал. Когда срабатывает сигнализация, вы можете запустить сервис и подключиться к серверу и сделать то, что вы хотите

1 голос
/ 24 мая 2019

Вы не можете остановить Workmanager в течение некоторого периода времени.

Вот трюк, просто добавьте это условие в doWork() метод

Обычно вам нужно проверить текущее время, т. Е. Вечернее или вечернее, если да, не выполняйте свою задачу.

Calendar c = Calendar.getInstance();
int timeOfDay = c.get(Calendar.HOUR_OF_DAY);
 if(timeOfDay >= 16 && timeOfDay < 21){
    // this condition for evening time and call return here
     return Result.success();
}
else if(timeOfDay >= 21 && timeOfDay < 24){
    // this condition for night time and return success 
      return Result.success();
}
0 голосов
/ 24 мая 2019

Я бы использовал двух рабочих.Сначала управлять, а затем получить местоположение.Первый будет работать периодически - каждые 24 часа вечером.Это остановит LocationService и вызовет его снова с задержкой.

0 голосов
/ 24 мая 2019

Если вы хотите выполнить что-то в определенное время, вы можете использовать AlarmManager, например:

Intent alaramIntent = new Intent(LoginActivity.this, AutoLogoutIntentReceiver.class);
    alaramIntent.setAction("LogOutAction");
    Log.e("MethodCall","AutoLogOutCall");
    alaramIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alaramIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 18);
    calendar.set(Calendar.MINUTE, 01);
    calendar.set(Calendar.SECOND, 0);
    AlarmManager alarmManager = (AlarmManager) this.getSystemService(ALARM_SERVICE);

    Log.e("Logout", "Auto Logout set at..!" + calendar.getTime());
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

Создать класс BroadcastReceiver:

public class AutoLogoutIntentReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent)
    {

        if("LogOutAction".equals(intent.getAction())){

            Log.e("LogOutAuto", intent.getAction());


            //Stops the visit tracking service
            Intent stopIntent = new Intent(context, VisitTrackingService.class);
            stopIntent.setAction(VisitTrackingService.ACTION_STOP_FOREGROUND_SERVICE);
            context.startService(stopIntent);

            //logs user out of the app and closes it
            SharedPrefManager.getInstance(context).logout();
            exit(context);

        }
    }

и нене забудьте добавить получателя в манифест (внутри тега приложения):

<receiver android:name=".AutoLogoutIntentReceiver" />

Для получения дополнительной информации о диспетчере аварий проверьте эту ссылку

Надеюсь, что этопомогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...