java - 如何使用 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 和后台进程。
解决方案
终于找到了解决我的问题的方法:
- 需要使用一个
处理程序
将工作从后台线程传递并运行到主线程。
- 需要使用
意图.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
}
}
推荐阅读
- anaconda - Anaconda Env 未启动关联的 VSC 工作区
- bash - 复杂的 bash 函数返回布尔值
- performance - 性能测试/混沌测试气流的最佳方法是什么?
- javascript - 无法从对象获取结果 - 错误提示不存在
- javascript - android中的navigator.share api更改用户共享文件的名称
- java - 暂停的@transactional 方法是否会阻塞资源?
- python - 每次触发 KeyboardInterrupt 或其他错误后,Selenium 驱动程序都会因 MaxRetryError 而崩溃
- react-bootstrap - 另一个选项卡中的选项卡在 React Boostrap 5 中不起作用
- bash - 如何在 Emacs 中从另一个 Git 分支打开文件?
- javascript - 我想多拍