2010-07-02 2 views
1

Я хотел бы сохранить хеш-таблицу в широковещательном приемнике. Если я понял, что жизненный цикл BroadcastReceiver в настоящее время может быть убит, уничтожив мои переменные-члены. Какова была бы идеальная стратегия для получения хеш-таблицы из предыдущего запуска onReceive в BroadcastReceiver?Сохранить данные в широковещательном приемнике

ответ

12

Существует два способа использования BroadcastReceiver, и вы не указали, что используете.

Один для приемника, зарегистрированного каким-либо другим компонентом - как Activity - через registerReceiver(). Этот приемник будет работать до тех пор, пока он зарегистрирован, и поэтому его данные могут длиться более одного звонка onReceive(). Компонент, который зарегистрировал приемник, будет нести ответственность за сохранение данных.

Другой - зарегистрировать приемник в манифесте. Те, за цитируемый проход в ответе cdonner, уйдут после одного звонка onReceive(). Вашему получателю необходимо будет сохранить свои данные, базу данных, плоский файл или что-то еще.

0

Из Reference Android:

BroadcastReceiver объект действителен только на время вызова OnReceive (Context, Intent). Как только ваш код вернется из этой функции, система считает объект законченным и больше не активным.

Не похоже, что то, что вы хотите сделать, будет работать. Actitivy, который регистрирует получателя, должен будет позаботиться об этом, или вы можете сохранить свою хэш-таблицу в базе данных.

0

Ваша лучшая стратегия заключается в использовании базы данных для хранения ваших данных в таблице вместо любого типа карты памяти.

Таким образом, это не имеет значения, если пользователь выключится, а затем снова включит телефон, ваши данные из предыдущих вызовов будут по-прежнему доступны.

0

обратное приведение данных к объекту класса, а затем вверх-отливать до требуемого объекта класса :-)


public void onReceive(Context context, Intent intent) { 
HashMap map = (HashMap) bundle.get("KEY"); 
Object[] data=map.get(mapKey); 
XXXX xxxx=data[0]; 
//... 
} 
2

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

static HashMap<String> hashMap; 
static { 
    hashMap.put("key1","string1"); 
} 

Такой же трюк может быть использован для регистрации обработчика, чтобы получить обратную связь от приемника.

+1

Static работает до тех пор, пока вы уверены, что система не убивает процесс, который он мог бы сделать после возвращения получателя, если ничего в этом процессе не активировано. – satur9nine

+0

Спасибо, хотя это, вероятно, не то, что хотел первоначальный вопрос, это именно то, что мне нужно. Способ кеширования этих данных, поэтому я получаю только удар производительности при первом вызове BroadcastReceiver. – domen

 Смежные вопросы

  • Нет связанных вопросов^_^