Пропущенные значения намерений «дополнительные» после перезагрузки - PullRequest
0 голосов
/ 26 июня 2018

Я только что узнал, что я не знаю, как сохранить дополнительные функции 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);

AlarmReceiver

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 , где мне нужно получить уведомление и сообщение

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);
}

Все работает нормально, но после перезагрузки мои дополнения становятся нулевыми. Благодаря.

1 Ответ

0 голосов
/ 26 июня 2018

Если вам нужно сохранить некоторые данные на постоянной основе, вы можете создать, например, HasMap , который содержит все ваши дополнительные значения

Map<String,String> extras = new HasMap<Strimg,String>();
extras.put("notificationId", notificationId);
extras.put("text",text);
.
.

И каждый раз, когда вы обновляете какое-либо значение, вы можете сериализовать эту Карту, сохранив ее в файле, который будет всегда доступен даже после перезагрузки

Сериализация и сохранение

FileOutputStream fos =new FileOutputStream("hashmap.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(extras);
oos.close();
fos.close();

Наконец, когда вы впервые запустите свое приложение после перезагрузки, вы свяжете с вашей картой дополнительные объекты, хранящиеся в сериализованном файле

Восстановить Hasmap

FileInputStream fis = new FileInputStream("hashmap.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
extras = (HashMap) ois.readObject();
ois.close();
fis.close();
...