Android отправить строку в службу, запущенную в другом процессе - PullRequest
0 голосов
/ 07 марта 2012

Я использую этот учебник, чтобы помочь мне использовать сервис, который всегда будет работать в фоновом режиме, даже если само приложение находится в фоновом режиме, и я хочу иметь возможность передавать строки между Моим основнымпроцесс и обслуживание.Дело в том, что повсюду я вижу, что маршалинг строк должен быть очень простым, но для более сложных вещей нужен AIDL.Поскольку я хочу отправлять только строковые сообщения, я подумал, что для этого должен быть очень простой способ, но я не могу его найти ..

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 марта 2012

Хорошо, это очень хакерское решение и очень не похожее на ООП, но это то, что я в итоге сделал, поэтому я выкладываю его здесь, если кто-нибудь когда-нибудь найдет потребность в простом, не очень элегантное (но работающее) решение.

Я использую 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);
    }
}
0 голосов
/ 07 марта 2012

Я полагаю, что служба намерений - это путь.Как создать службу намерений объясняется здесь

...