Я хотел бы сохранить хеш-таблицу в широковещательном приемнике. Если я понял, что жизненный цикл BroadcastReceiver в настоящее время может быть убит, уничтожив мои переменные-члены. Какова была бы идеальная стратегия для получения хеш-таблицы из предыдущего запуска onReceive в BroadcastReceiver?Сохранить данные в широковещательном приемнике
ответ
Существует два способа использования BroadcastReceiver
, и вы не указали, что используете.
Один для приемника, зарегистрированного каким-либо другим компонентом - как Activity
- через registerReceiver()
. Этот приемник будет работать до тех пор, пока он зарегистрирован, и поэтому его данные могут длиться более одного звонка onReceive()
. Компонент, который зарегистрировал приемник, будет нести ответственность за сохранение данных.
Другой - зарегистрировать приемник в манифесте. Те, за цитируемый проход в ответе cdonner, уйдут после одного звонка onReceive()
. Вашему получателю необходимо будет сохранить свои данные, базу данных, плоский файл или что-то еще.
Из Reference Android:
BroadcastReceiver объект действителен только на время вызова OnReceive (Context, Intent). Как только ваш код вернется из этой функции, система считает объект законченным и больше не активным.
Не похоже, что то, что вы хотите сделать, будет работать. Actitivy, который регистрирует получателя, должен будет позаботиться об этом, или вы можете сохранить свою хэш-таблицу в базе данных.
Ваша лучшая стратегия заключается в использовании базы данных для хранения ваших данных в таблице вместо любого типа карты памяти.
Таким образом, это не имеет значения, если пользователь выключится, а затем снова включит телефон, ваши данные из предыдущих вызовов будут по-прежнему доступны.
обратное приведение данных к объекту класса, а затем вверх-отливать до требуемого объекта класса :-)
public void onReceive(Context context, Intent intent) {
HashMap map = (HashMap) bundle.get("KEY");
Object[] data=map.get(mapKey);
XXXX xxxx=data[0];
//...
}
Одно из возможных решений, чтобы сделать эту карту статическим. Это выглядит нормально для получателей, зарегистрированных в манифесте, поскольку на нем одновременно есть только один приемник.
static HashMap<String> hashMap;
static {
hashMap.put("key1","string1");
}
Такой же трюк может быть использован для регистрации обработчика, чтобы получить обратную связь от приемника.
Static работает до тех пор, пока вы уверены, что система не убивает процесс, который он мог бы сделать после возвращения получателя, если ничего в этом процессе не активировано. – satur9nine
Спасибо, хотя это, вероятно, не то, что хотел первоначальный вопрос, это именно то, что мне нужно. Способ кеширования этих данных, поэтому я получаю только удар производительности при первом вызове BroadcastReceiver. – domen