@korvin2

Как сохранить и Получить(!) данные Intent extra's после перезагрузки?

Здравствуйте
Такое дело: нужна возможность создавать несколько уведомлений, которые будут повторяться каждый день в то время, которое указано. Проще говоря, уведомления по расписанию.
Все работает хорошо, но только вот после перезагрузки показывается только первое уведомление (и то, у него теряется id и текст), а все уведомления, которые "записаны" после него - пропадают. Дело в том, что BroadcastReceiver теряет данные, которые я посылаю через Intent.
Часть кода из MainActivity, который активируется при нажатии на кнопку. Тут я и задаю в Intent данные notificationId и text :
spoiler
int notificationId = (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE);
                String text = etText.getText().toString();
                Context context = MyApp.getContext();
                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_UPDATE_CURRENT);
                AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
                alarm.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime, AlarmManager.INTERVAL_DAY, alarmIntent);
AlarmReceiver, который принимает эти данные
spoiler
private static final String BOOT_COMPLETED =
            "android.intent.action.BOOT_COMPLETED";
    private static final String QUICKBOOT_POWERON =
            "android.intent.action.QUICKBOOT_POWERON";
    public static Context appContext;

    @Override
    public void onReceive(Context context, Intent intent) {

        appContext = MyApp.getContext();

        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, который принимает данные уже от AlarmReceiver и создает уведомление
spoiler
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, Id, 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);
        service.setAction(message);
        service.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        stopService(service);
    }
AndroidManifest
spoiler
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.a52780.nontifications"
    android:installLocation="internalOnly">

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.SET_ALARM" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:name=".MyApp">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name="com.example.a52780.nontifications.AlarmReceiver"
            android:enabled="true"
            android:exported="false"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.example.a52780.nontifications.BootService"
            android:enabled="true"
            android:exported="false"/>


    </application>

</manifest>


Собственно, на этом всё. Я понимаю, что Intent extras и не должны сохраняться после перезагрузки. Но просто не приходит в голову, как еще сохранить id и text уведомления. Была мысль использовать SharedPreferences, да только вот там каждому уведомлению всё равно придется задавать уникальный ключ. И как тогда мне получать эти ключи, не зная их? Такой вот замкнутый круг. Скорее всего я допустил какую-то глупую ошибку или не знаю чего-то важного, но в Android'e я новичок, так что надеюсь на вашу помощь :)
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
402d
@402d
начинал с бейсика на УКНЦ в 1988
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы