2017-02-06 22 views
0

Рассмотрите данные, сгенерированные в службе (Постоянно), я хочу, чтобы другое приложение извлекало данные из службы.Обмен данными (односторонняя связь) между сервисом и отдельным приложением. (Android)

Пример: приложение A (служба) откроет последовательный порт и свяжется с внешним устройством для получения данных.

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

+0

Если вы делаете это через HTTP, я бы предложил либо посмотреть на веб-сокеты, либо рассмотреть возможность переключения на выгрузку данных у пользователя. HTTP - это протокол запроса/ответа. В управлении получением данных существует большая сложность. Лучше оставить сервис из него и позволить клиентам выяснить, что им нужно. – duffymo

+0

Как часто изменяются данные? Каков размер данных? Вы ищете push-решение (услуга делает что-то, что может привести к тому, что изменения будут доставляться клиенту), решение pull (услуга отвечает только на запросы данных от клиента) или и то, и другое? IOW, это мало связано с последовательными портами и имеет много общего с характером обмена данными. – CommonsWare

+0

@CommonsWare Я хочу, чтобы служба отвечала на запрос, и я не знаю, как часто меняются данные. – NKR

ответ

2

Вы можете использовать Broadcasts.

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

В приложении с услугой вы можете отправить радиопередачу так:

public class MyService extends Service { 

    public static final String ACTION_PUBLISH_DATA = "com.example.action.publish_data"; 

    public void publishResult(Bundle data) { 
     Intent intent = new Intent(ACTION_PUBLISH_DATA); 
     intent.putExtras(data); 
     sendBroadcast(intent); 
    } 

} 

В клиентских приложениях, создать вещательный приемник:

public class DataBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // do something with data in the intent. 
    } 

} 

и зарегистрировать его в манифесте как так :

<application> 
    ... 

    <receiver android:name="com.example.DataBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="com.example.action.publish_data" /> 
     </intent-filter> 
    </receiver> 

</application> 

Вместо регистрации в вашем манифесте вы также можете зарегистрировать приемник во время выполнения с помощью registerReceiver методы

Редактировать:
Это, насколько я знаю, самый простой способ для обмена данных между несколькими приложениями. Но учтите: как сказано в комментариях, это не по запросу. Служба знает, кто, или кто-то вообще, слушает трансляции.
Вы также можете отправлять трансляции из клиентского приложения в сервисное приложение, чтобы запустить или остановить службу.
Вы также можете использовать IntentService в своем приложении A и запускать его из других приложений (с помощью ResultReceiver в дополнение). Или вы также можете изучить ContentProviders

AIDL вариант, но я бы не рекомендовал это для вас, так как он более продвинутый.

+0

Спасибо, я попробую это. если вы можете предоставить образец полного кода приложения, это будет очень полезно, потому что я очень новичок в программировании на Android. – NKR

+0

@NKR Полное рабочее приложение выходит за рамки этого вопроса. Если вы только начинаете, я рекомендую запустить [здесь] (https://developer.android.com/training/basics/firstapp/index.html) и следить за ними до тех пор, пока у вас не будет запущенного приложения. Затем вы можете работать над добавлением элементов, как описано в ответе, для которых [this] (https://developer.android.com/guide/components/intents-filters.html) может быть хорошим чтением. – RobCo

+0

Спасибо, я просмотрю эти ссылки. – NKR