Отправить данные из Сервиса обратно в мою деятельность - PullRequest
4 голосов
/ 28 января 2011

У меня есть действие, которое создает намерение, добавляет некоторые дополнительные функции с помощью метода putExtra () и вызывает startService (намерение) для запуска службы.

Этот сервис вычисляет некоторые вещи на основе дополнительных данных, а затем я хочу отправить результат обратно в действие.

Каким образом я могу это сделать?

Я попытался создать намерение в своем сервисе и передать его с помощью sendBroadcast (). У меня есть широковещательный приемник, но я не уверен, правильно ли я его зарегистрировал. Я не совсем понимаю!

Есть ли другой способ сделать это? Что-то вроде StartActivityForResult, но для сервисов (что-то вроде StartServiceForResult или что-то)?

Ответы [ 3 ]

5 голосов
/ 14 июля 2011

Метод, который вы пытаетесь использовать, хорош!Но без кода будет трудно сказать, что вы делаете неправильно.

В вашем сервисе вы бы транслировали намерение, подобное этому ...

/**
 * Send broadcast to the activity letting it know the service is active
 * 
 * @param pActivate
 */
private final void sendServiceActiveBroadcast( final boolean pActivate ) {
    final Intent _intent = new Intent();
    _intent.setAction( "com.yourtld.android.SERVICE_BROADCAST" );
    _intent.addCategory( "com.yourtld.android.CATEGORY" );
    _intent.putExtra( "isactive", pActivate );

    this.sendBroadcast( _intent );
}

, тогда в своей деятельности вы могли быесть что-то вроде ...

Создайте строку действия:

private static final String SERVICE_BROADCAST_ACTION = "com.yourtld.android.SERVICE_BROADCAST";

В вашем методе onResume () у вас будет ...

final IntentFilter serviceActiveFilter = new IntentFilter( SERVICE_BROADCAST_ACTION );

serviceActiveFilter.addCategory( "com.yourtld.android.CATEGORY" );

this.serviceReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive( final Context context, final Intent intent ) {
        if( intent != null ) {
            if( intent.getBooleanExtra( "isactive", false ) ) {
                // The service is active
            } else {
                // False...
            }
        }
    }
};
this.registerReceiver( this.serviceReceiver, serviceActiveFilter );

Надеюсь, что это поможет

0 голосов
/ 20 марта 2016

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

Во-вторых, вы начинаете действие с FLAG_ACTIVITY_SINGLE_TOP.Это препятствует запуску действия, если оно уже выполняется.

В-третьих, вы реализуете в своей активности onNewIntent(), чтобы отследить любые намерения, которые отправляет служба, если ваша активность уже выполняется.

0 голосов
/ 14 июля 2011

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

  1. Вы можете создать намерение и поместить данные в намерение и начать это действие ----- плохая идея
  2. Выможно использовать SharedPreferences для передачи значений - только для примитивных значений
  3. Вы можете использовать статические переменные ------, которые я считаю лучшим способом передачи из службы.

Примечание: Вы также можете использовать БД, что хорошо, если у вас есть большой объем данных.

...