На Android я пытаюсь отправить пользовательское широковещательное сообщение с использованием пользовательских Intent и BroadcastListeners. У меня есть пользовательские данные в формате:
List<Hashtable<String,List<String>>> data;
При попытке использования:
intent.putExtra("mydata", data);
Я получаю сообщение об ошибке:
The method putExtra(String, boolean) in the type Intent is not applicable for the arguments (String, List<Hashtable<String,List<String>>>)
Глядя на класс Intent, есть куча публичных методов, которые перегружают putExtra(). Однако ни один из них не соответствует данным, которые я пытаюсь отправить.
Как представляется, существует довольно общий метод
putExtra(String name, Bundle value)
Тем не менее, я не уверен, как преобразовать свои данные в Bundle, чтобы использовать это. Правильно ли это делать? Или есть более простой метод?
Вы хотите иметь Serializable для putExtra(String name, Serializable s)
. Однако List
- это интерфейс, который не расширяет Serializable
. Попробуйте объявить его как ArrayList
.
Я столкнулся с какой-то проблемой. Я решил это уродливо, я думаю, вы можете считать это ссылкой.
Я положил Map
в глобальный объект одноплодного, ключ Map
является String
, то Map
будет держать объект я хочу передать в Intent
, вместо того, чтобы поместить объект в Intent
, я поставил String
ключ в Intent
. В Activity
(или услугах...), где намерение было передано, я получаю ключ от Intent
, а затем получить объект, который я действительно заботиться о с Mao
.
Может быть, это недостаточно ясно, вот псевдокод:
public void sendIntent() {
Object data; // the object you want to pass through Intent
Map<String, Object> globalMap = getMyGlobalMap();
String uid = UUID.randomUUID().toString();
globalMap.put(uid, data);
intent.putExtra(EXTRA_OBJECT_UID, uid);
}
public void receiveIntent() {
String uid = intent.getStringExtra(EXTRA_OBJECT_UID);
Object data = getMyGlobalMap().get(uid); // Here is your data object.
}
Обратите внимание, что, поскольку вы помещаете глобальную карту в одноэлементный объект, вы можете удалить объект с Map
когда закончите с ним, потому что карта будет там до тех пор, пока ваше приложение будет жить, вы можете не захотеть бесполезные объекты и пусть они берут вашу драгоценную память.
Обновить
Еще одна важная вещь: компонент, который отправляет Intent и компонент, который получит Intent, должен находиться в одном процессе, только классы в одном процессе могут обмениваться данными в кучу.
List<Hashtable<String,List<String>>>
), то я думаю, что вы можете рассмотреть это решение.