web-dev-qa-db-ja.com

Androidワークマネージャーのスケジュールされたワーカーがタスクの強制終了後に失われた

新しいWorkManager API、1.0.0-alpha06を使用して、15分ごとにワーカーを実行しようとしています。私が間違っていない場合、PeriodicWorkRequestでワークマネージャーを使用すると、ワーカー存続タスクが強制終了され、電話が再起動しますが、最近のアプリからタスクをスワイプすると、スケジュールされたワーカーが失われます(私は周りを待っていました) 15分間隔でスケジュールされたワーカーのログを表示するには45分)。

これらは私のファイルです:

MyExampleWorker.Java:

public class MyExampleWorker extends Worker{
    public static final String TAG = "MY_EXAMPLE_WORKER";

    @NonNull
    @Override
    public Result doWork() { 
        Log.i(TAG, "Starting background worker");
        // Getting configuration data
        long param1 = getInputData().getLong("param1", 60000);
        String param2 = getInputData().getString("param2");
        String param3 = getInputData().getString("param3");

        PackageManager pckMgr = mContext.getPackageManager();
        ...
        ..
        .
        return Result.SUCCESS;
    }

}

Main.Java:このメソッドは、アプリが起動するとすぐに起動します

@ReactMethod
public void execute() {
    Log.i(TAG, "inside execute, setting up periodic worker in workManager");

    Data inputData = new Data.Builder()
            .putLong("param1", 60000)
            .putString("param2", "something")
            .putString("param3", "something else")
            .build();

    PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest
            .Builder(MyExampleWorker.class, PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS)
            .setInputData(inputData)
            .addTag(MyExampleWorker.TAG)
            .build();

    WorkManager.getInstance().enqueueUniquePeriodicWork(MyExampleWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
}

[〜#〜] update [〜#〜]:それだけでなく、もう一度アプリを開くと、のログが表示されます "実行中、設定workManagerで定期的なワーカーを起動します "が、ワーカーがスケジュールされていないようです。1時間以上経過しており、logcatにワーカーのログがありません。

ここで何か不足していますか?

どんな助けでも大歓迎です!!

ディエゴ

12
Dieguinho

これは、バッテリーの最適化やDozeモードによって引き起こされる問題です。特に、Oxygen OSやMIUIなどのChinese Romを使用している場合に発生します。

Stock Romでアプリをテストします。これで問題なく動作します。全く問題はありません。これは、これらの中国語ROMがバックグラウンドサービスの実行を妨げるカスタムの省電力技術を有効にするためです。

あなたができる2つのこと:

  1. バッテリーの最適化を無視してアプリをホワイトリストに登録します。これを有効にすると、ユーザーは次のように尋ねられます、

enter image description here

プログラムで質問できます

_    Intent intent = new Intent();
    String packageName = context.getPackageName();
    PowerManager pm = (PowerManager) 
    context.getSystemService(Context.POWER_SERVICE);
    if (pm.isIgnoringBatteryOptimizations(packageName))
        intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
    else {
      intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
      intent.setData(Uri.parse("package:" + packageName));
    }
    context.startActivity(intent);
_

そしてあなたのマニフェストで

_<uses-permission 
Android:name="Android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
_

このようにアプリをホワイトリストに登録すると、ワークマネージャーが機能します。ただし、上記の許可をリクエストすると、残念ながらGoogleはアプリをPlayストアから削除します。理由は誰にもわかりません!!!

Googleの反トラスト問題に関するこの記事を読んでください

  1. 2番目の方法は、上記のダイアログを表示しないことで、ユーザーにアプリをホワイトリストに登録するよう依頼することです。あなたはこれを行うことができます

startActivityForResult(new Intent(Android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS), 0);

4
This Guy Codes