Хорошо, это очень хакерское решение и очень не похожее на ООП, но это то, что я в итоге сделал, поэтому я выкладываю его здесь, если кто-нибудь когда-нибудь найдет потребность в простом, не очень элегантное (но работающее) решение.
Я использую sendBroadcast
и broadcastReceiver
для связи между службой и приложением.
Проблема в том, что отправка намерений кросс-процесс по какой-то причине удаляет все дополнительные функции, поэтому я использовал SharedPrefences
вместо.
это (синглтон) класс, который я использую для публикации и подписки на такие строковые сообщения.
Интерфейс посетителя
public interface Visitor<T> {
public void visit(T element);
}
Интерфейс публикуемого абонента:
public interface IPulishSubscribe {
/**
* Publish a new string message
*
* @param key The key to publish under
* @param text The message's content
*/
public void publish(String key, String text);
/**
* Subscribe to a message
*
* @param key The key to subscribe to
* @param visitor The visitor to handle the message when received
*/
public void subscribe(final String key, final Visitor<String> visitor);
}
Реализация
public class PublishSubscriber implements IPulishSubscribe {
private static IPulishSubscribe _instance = new PublishSubscriber();
private static Context _context;
// key -> handler, isn't of much use ATM, but you may need it for removals...
private Map<String, BroadcastReceiver> _subscribers = new HashMap<String, BroadcastReceiver>();
private PublishSubscriber() {
}
public static void init(Context context) {
_context = context;
}
public static IPulishSubscribe getInstance() {
return _instance;
}
@Override
public synchronized void publish(String key, String text) {
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(_context);
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString(key, text);
editor.commit();
_context.sendBroadcast(new Intent(key));
}
@Override
public synchronized void subscribe(final String key, final Visitor<String> visitor) {
BroadcastReceiver newSubscriber = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(_context);
String data = mPrefs.getString(key, null);
if (visitor != null) {
visitor.visit(data);
}
}
};
_context.registerReceiver(newSubscriber, new IntentFilter(key));
_subscribers.put(key, newSubscriber);
}
}