java - 重新启动后缺少意图“附加”值
问题描述
我刚刚发现我不知道如何在设备重启后保存我的 Intent 额外内容。我需要它来发送通知。
这是我设置警报的MainActivity的一部分
Calendar startTime = Calendar.getInstance();
startTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
startTime.set(Calendar.MINUTE, minute);
startTime.set(Calendar.SECOND, 0);
long alarmStartTime = startTime.getTimeInMillis();
Intent intent = new Intent(context, AlarmReceiver.class);
intent.putExtra("notificationId", notificationId);
intent.putExtra("text", text);
intent.putExtra("alarmStartTime", alarmStartTime);
intent.setAction("android.intent.action.BOOT_COMPLETED");
intent.setAction("android.intent.action.QUICKBOOT_POWERON");
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime, AlarmManager.INTERVAL_DAY, alarmIntent);
报警接收器
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null){
int notificationId = extras.getInt("notificationId");
String message = extras.getString("text");
String action = intent.getAction();
if (BOOT_COMPLETED.equals(action) ||
QUICKBOOT_POWERON.equals(action)) {
Intent service = new Intent(context, BootService.class);
service.setAction(message);
service.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
service.putExtra("notificationId", notificationId);
service.putExtra("text", message);
context.startService(service);
}
}
}
BootService中我需要获取 notificationId 和消息的方法
private void setAlarm(int Id, String message) {
Context context = MyApp.getContext();
Intent mainIntent = new Intent(context, MainActivity.class);
mainIntent.setAction("android.intent.action.BOOT_COMPLETED");
mainIntent.setAction("android.intent.action.QUICKBOOT_POWERON");
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager myNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(context);
builder.setSmallIcon(android.R.drawable.ic_dialog_info)
.setContentTitle("Wake up! " + Id)
.setContentText(message)
.setWhen(System.currentTimeMillis())
.setContentIntent(contentIntent);
myNotificationManager.notify(Id, builder.build());
}
@Override
protected void onHandleIntent(Intent intent) {
int Id = intent.getExtras().getInt("notificationId", 0);
String message = intent.getExtras().getString("text");
setAlarm(Id, message);
Context context = MyApp.getContext();
Intent service = new Intent(context, BootService.class);
stopService(service);
}
一切正常,但重新启动后我的附加功能为空。谢谢。
解决方案
如果您需要永久保存一些数据,您可以创建例如包含所有额外价值的HasMap
Map<String,String> extras = new HasMap<Strimg,String>();
extras.put("notificationId", notificationId);
extras.put("text",text);
.
.
每次更新某些值时,您都可以序列化此 Map 将其保存在文件中,即使重新启动后也始终可用
序列化并保存
FileOutputStream fos =new FileOutputStream("hashmap.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(extras);
oos.close();
fos.close();
最后,当您在重新启动后首次运行应用程序时,您将在 Map extras 中关联存储在序列化文件中的对象
恢复 Hasmap
FileInputStream fis = new FileInputStream("hashmap.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
extras = (HashMap) ois.readObject();
ois.close();
fis.close();
推荐阅读
- python - 将带有 pandas 的文件导入到 iPad 上运行的 Jupyter Notebook,使用应用程序 carnets
- python - __init__ 函数中的“del self.self”是什么意思?
- python-3.x - 带有异步请求库的猴子补丁代理
- ios - Run on iOS 13 device using Xcode without iOS 13
- python-3.x - 如何从 keras 高级层中获取权重?
- android - 使用改造 2 加载图像
- c# - 不在大厅时使用 LoadBalancingClient 轮询可用的 Unity Photon 房间?
- android - 为什么我的电子邮件和密码变量作为未解决的参考出现?
- node.js - 如何将参数传递到我的 put 调用中?
- excel - 确保用户窗体上的组合框和文本框不为空