首页 > 解决方案 > 如何使用 WorkManager 显示新活动(屏幕)

问题描述

MyWorker.class:

public class MyWorker extends Worker {

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


    @NonNull
    @Override
    public Result doWork() {
        Log.d("TAG","WORK: ");
        //my actual work....

        Intent intent = new Intent(getApplicationContext(), NewScreen.class);
       getApplicationContext().startActivity(intent);

        return Result.success(); //true - success / false - failure
    }
}

主要活动:

public class MainActivity extends AppCompatActivity {
     OneTimeWorkRequest oneTimeWorkRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       // TextView textView = findViewById(R.id.text);

        oneTimeWorkRequest = new OneTimeWorkRequest.Builder(MyWorker.class)
                .setConstraints(new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .build())
                .build();


        WorkManager.getInstance().enqueue(oneTimeWorkRequest);
    }
}

我正在尝试使用 WorkManager 从 MainActivity 打开一个新活动(屏幕)。尝试学习和试验 WorkManager。如果我输入运行日志,即执行 doWork()。此外,我在意图上添加了断点,它可以工作,但 UI 没有受到影响。

仅供参考 - 我是新手,正在学习 WorkManager 和后台进程。

标签: javaandroid-intentandroid-workmanager

解决方案


终于找到了解决我的问题的方法:

  • 需要使用一个

处理程序

将工作从后台线程传递并运行到主线程。

  • 需要使用

意图.setFlags(FLAG_ACTIVITY_NEW_TASK);

因为我一直在 Activity 上下文之外调用意图。

  • 添加 Looper 作为参数

处理程序(Looper.getMainLooper())

因为如果您在非 UI 线程中创建处理程序,您会将消息发布到非 UI 线程。默认情况下,处理程序将消息发布到创建它的线程。- 使用创建的 Worker 类的构造函数的上下文。

解决方案代码:

import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;

import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;


public class MyWorker extends Worker {
    Context mcontext;

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


    @NonNull
    @Override
    public Result doWork() {
        Log.d("TAG","WORK: ");
        //my actual work....

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(mcontext, NewScreen.class);
                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
                mcontext.startActivity(intent);
            }
        });


        return Result.success(); //true - success / false - failure
    }
}

推荐阅读