2016-06-30 2 views
2

Я хочу, чтобы каждое приложение могло отправлять данные в мою службу. Поэтому мне нужно взаимодействие между процессами. На каждой странице я могу найти предложения использовать Messenger, AIDL или Intents (BroadcastReceiver). До сих пор я мог понять, построив некоторые тестовые приложения, так это то, что BroadcastReceiver чрезвычайно медленный, и сообщения могут потеряться без уведомления при отправке с несколькими потоками внутри цикла while(true). AIDL и Messenger не только сложны в реализации (услуга необходима, связующее, ...), но и могут обеспечить странное поведение, например, при отправке несколькими потоками, что приводит к удалению RemoteException (!!! FAILED BINDER TRANSACTION !!!) с AIDL, когда используя ключевое слово oneway. Я хочу гарантировать, что доставка гарантирована. Есть ли причина использовать oneway, когда доставка должна быть гарантирована?Android ipc LocalSocket vs Binder (AIDL)

Тем не менее, LocalSocket кажется чрезвычайно простым в использовании (нет необходимости в службе, работает так же, как java-сокет). Клиентские приложения могут только открыть LocalSocket, подключиться к указанному адресу, а затем while(true) outputstream.writeObject();

Есть ли недостатки при использовании LocalSocket, потому что на странице разработчика Android говорится: «Некоторые приложения пытаются реализовать IPC с использованием традиционных технологий Linux, таких как сетевые сокеты и общие файлы. Мы настоятельно рекомендуем вам использовать вместо функции Android системы для IPC», но не от дальнейших комментариев по этому

ответ

1

есть ли минусы при использовании LocalSocket

  1. Нет защиты на уровне фрейма для LocalSocket. Хотя вы можете «хотеть, чтобы каждое приложение могло отправлять данные в мою службу», пользователь не может, поэтому стандартный IPC может быть защищен разрешениями.

  2. startService() и bindService() приведет к созданию экземпляра вашей службы, даже приступив к процессу для вас, если потребуется для обработки запроса. Ваша служба не будет работать все время. Итак, вам нужно startService() или bindService() в любом случае.

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