android - 如何通过 Workmanager 定期发送随机通知
问题描述
我可以每 15 分钟定期发送一次通知,但我无法更改通知的内容。我有一个字符串数组,workmanager 总是发送相同的项目。例如,起初它采用 valur “四”,它总是发送“四”
1 - 我在 strings.xml 中定义了一个字符串数组
<string-array name="numbers">
<item>one</item>
<item>two</item>
<item>three</item>
<item>four</item>
<item>five</item>
</string-array>
2 - 我的 MainActivity 类
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
public static final String KEY_TASK_DESC = "key_task_desc";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] list = getResources().getStringArray(R.array.numbers);
Random random = new Random();
int number = random.nextInt(list.length);
Data data = new Data.Builder()
.putString(KEY_TASK_DESC, list[number]).build();
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest
.Builder(MyWorker.class, 15, TimeUnit.MINUTE)
.setInputData(data)
.build();
WorkManager.getInstance().enqueue(periodicWorkRequest);
}}
3 - 包含 displayNotif(String inputData) 方法的 MyWorker 类
public class MyWorker extends Worker {
public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
String inputData = getInputData().getString(MainActivity.KEY_TASK_DESC);
displayNotif(inputData);
return Result.success();
}
private void displayNotif(String inputData) {
NotificationManager manager =
(NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel("notif",
"notif", NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(channel);
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), "notif")
.setContentText(inputData)
.setSmallIcon(R.mipmap.ic_launcher);
manager.notify(1, builder.build());
}}
解决方案
我认为您可能误解了您的PeriodicWorkRequest
设置。
你只用一个(你的字符串)调用setInputData
一次。data
每次运行,它仍然只有这个data
。
要随机显示一个字符串,您的随机选择必须发生在您的 Worker'sdoWork
中。
推荐阅读
- mysql - 复杂的sql查询 - 无法弄清楚
- sql - 使用 SQL 过程返回表?
- sql - 将具有相似标识符的两行数据相加
- mulesoft - 嵌套数组列表上的 dataweave 过滤器和 maxBy
- java - 从命令行编译 Java '找不到符号'
- javascript - 如何在 React 渲染中无限循环数组?
- javascript - 如何使用订阅将对象推送到可观察对象?
- ios - 使用 CloudKit 查询以及 tableview 方法 (numberOfRowsInSection) 可能被调用的次数无法预测的事实
- php - 如何使用php电子邮件发送带有附件的电子邮件
- vba - 使用带有 Word FormatFont 对话框的 VBA 更改内容控制文本名称