Периодические запросы на работу с использованием WorkManager не работают

Я пытаюсь написать периодический сценарий workmanager, но он просто запускается, когда я открываю приложение, и запускается только один раз (не периодически)!

вот моя основная деятельность:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_work);

    Intent intent = new Intent();
    PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);
    NotifyWorker.pendingIntent = pendingIntent;
    NotifyWorker.context = this;

    PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(NotifyWorker.class, 1, TimeUnit.MINUTES).build();
    WorkManager.getInstance().enqueue(periodicWorkRequest);
}

}

и это мой метод dowork:

public Result doWork() {
    Log.i("wd","wd");

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context,"ctx")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher))
            .setSmallIcon(R.drawable.logo)
            .setContentTitle("Title")
            .setContentText("Desc")
            .setContentIntent(pendingIntent);

    android.app.NotificationManager notificationManager =
            (android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 , notificationBuilder.build());

    return Result.SUCCESS;
}

почему его не запускать каждую минуту? что я скучаю?


person Qasem Salehy    schedule 30.06.2018    source источник


Ответы (2)


В PeriodicWorkRequest.Builder документации:

IntervalMillis должен быть больше или равен PeriodicWorkRequest.MIN_PERIODIC_LL

Это значение в настоящее время установлено на 900000, то есть 15 минут.

person ianhanniballake    schedule 30.06.2018
comment
ой ! моя вина . следующий вопрос: почему мой рабочий менеджер срабатывает 3 или 4 раза, а затем перестает работать! это не продолжится после того, как я закрою приложение! он должен работать после закрытия приложения, не так ли?!?! - person Qasem Salehy; 01.07.2018
comment
Если вы просто имеете в виду нажатие системной кнопки «Назад» для выхода из приложения, это не должно повлиять на WorkManager. Имейте в виду, что WorkManager не работает с точным временем и не работает в спящем режиме. - person ianhanniballake; 02.07.2018
comment
@ianhanniballake - Диспетчер работ запускается, даже если мы убили приложение? - person ysfcyln; 07.08.2018
comment
@ysfcyln - ничего из приложения не запускается, если приложение принудительно остановлено, но в следующий раз, когда приложение запускается, любая работа, которую все еще необходимо выполнить, запускается. - person ianhanniballake; 12.08.2018
comment
тестировал его, настраивая его на запуск каждые несколько секунд, не заметил этого в документации. Спасибо - person Arnav Rao; 21.09.2018
comment
Большое спасибо, IDE может дать некоторую информацию по этому поводу; / я прав? :) - person Krzysztof Kubicki; 09.05.2019
comment
@ ianhanniballake- ›как насчет WorkRequest, работающего на KitKat? WorkManager должен использовать BroadcastReceiver и Service, это должно быть постоянным, даже если приложение будет убито, верно? - person Krzysztof Kubicki; 09.05.2019
comment
@KrzysztofKubicki - предупреждения также сбрасываются, когда ваше приложение принудительно останавливается. - person ianhanniballake; 09.05.2019
comment
@ianhanniballake - Вы уверены, что WorkManager не будет работать в спящем режиме? - person Rasool Mohamed; 22.05.2019
comment
@RasoolMohamed да нормально работать менеджер в спящем режиме не будет, тестировал по логам. - person humble_wolf; 08.01.2020
comment
@humble_wolf: Есть ли какое-нибудь решение, чтобы эта работа работала даже в режиме Doze? - person AndroidGuy; 27.02.2020
comment
@AndroidGuy, это может помочь, developer.android.com/training/ мониторинг-состояние-устройства / - person humble_wolf; 27.02.2020
comment
моя проблема в том, что в эмуляторе он работает нормально. но на реальных устройствах я не получаю никаких уведомлений. Возможно ли, что в некоторых случаях система игнорирует выполнение периодической работы? - person chitgoks; 05.06.2020

Прежде всего, вы можете не согласиться с моим ответом, но вот хак, который я использовал в своем проекте, и эта работа работает очень точно, без каких-либо проблем. Пора увидеть код. Я указал на одну вещь позже и должен прочитать этот пункт после кода. РАЗДЕЛ IMP

//this code in your activity, fragment or any other class
notify_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked)
                {
                    OneTimeWorkRequest track_share_market = new OneTimeWorkRequest.Builder(NotificationWorker.class).setInitialDelay(1,TimeUnit.MINUTES).addTag("Stock_Market").build();
                    WorkManager.getInstance().enqueue(track_share_market);
                    Log.d("RishabhNotification","SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs");
                }
                else {
                    Log.d("RishabhNotification","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
                    WorkManager.getInstance().cancelAllWorkByTag("Stock_Market");
                }
            }
        });

Теперь ваш Worker Код класса

public class NotificationWorker extends Worker {

    public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        try {
         //Some heavy operation as you want there is no need to make another thread here 
          //track some website for weather changes or stock market changes
         //In my case doWork takes only 10sec for executing this method  

            ShowNotification("Market Up","Gold Price goes upto ₹25,000 ","Check the app for the new update");
            StartNewRequest();
            return Result.success();

        } catch (Exception e) {
            e.printStackTrace();
            StartNewRequest();
            Log.d("RishabhNotification","ERERERERERERERERERERERERERERERERERERERERERERERERERERERE");
            return Result.failure();
        }
    }

 private void StartNewRequest()
    {
        OneTimeWorkRequest track_market = new OneTimeWorkRequest.Builder(NotificationWorker.class).setInitialDelay(1,TimeUnit.MINUTES).addTag("Stock_Market").build();
        WorkManager.getInstance().enqueue(track_market);
    }

    private void ShowNotification(String Message, String name, String Information)
    {
        NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
        String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Stock Market", NotificationManager.IMPORTANCE_HIGH);

            // Configure the notification channel.
            notificationChannel.setDescription("Channel description");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.GREEN);
            notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
            notificationChannel.enableVibration(true);
            notificationChannel.setSound(null,null );
            notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
            notificationManager.createNotificationChannel(notificationChannel);
        }


        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext(), NOTIFICATION_CHANNEL_ID);

        Uri uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        notificationBuilder.setAutoCancel(false)
                .setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE|Notification.DEFAULT_LIGHTS)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setSound(uri)
                .setVisibility(Notification.VISIBILITY_PUBLIC)
                .setPriority(Notification.PRIORITY_MAX)
                .setContentTitle(Message)
                .setContentText(name)
                .setContentInfo(Information);

        notificationManager.notify(/*notification id*/1, notificationBuilder.build());
    }
}

Теперь прочтите пункт РАЗДЕЛ IMP. Этот код отлично работает в эмуляторе, телефоне Pixel, телефоне Samsung, телефоне Moto, телефоне Asus, телефоне One plus, но тот же код, который я тестировал на устройствах Xioami и Huawei, они оба устройства не запускают код для каждого определенного временного интервала (они оба запускают код, но время может быть изменено), который я определяю в своем коде. Я не знаю, почему это происходит на обоих устройствах. Может какая-то оптимизация. Перейдите по этой ссылке, чтобы узнать больше https://www.reddit.com/r/androiddev/comments/9ra0iq/workmanager_reliability_for_periodic_tasks_on/ Я не тестировал этот код в естественных условиях и на устройствах Oppo.

person Rishabh Rawat    schedule 16.01.2019