2015-03-06 3 views
1

Я пытаюсь создать внешнюю службу вещания, которая отправляет номер. Клиент (внешнее приложение), пытающийся отправить запрос на мою службу, и служба отправляет обратно номер. Я зарегистрировал свой сервис и широковещательный resiever в AndroidManifest.xml:Результат широковещания всегда равен нулю

<service android:exported="true" android:enabled="true" android:name=".MyService"/> 
<receiver android:exported="true" android:enabled="true" android:name=".MyStartServiceReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.SEND" /> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
</receiver> 

мой класс вещания:

public class MyStartServiceReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent intent1 = new Intent(context, MyService.class); 
     context.startService(intent1); 
    } 
} 

в классе MYSERVICE Я пытаюсь поставить дополнительные данные

public void onStart(Intent intent, int startId) { 
    Log.i(TAG, "service started"); 
    intent.setClass(getApplicationContext(), MyService.class); 
    intent.setAction(Intent.ACTION_SEND); 
    intent.putExtra("result", 10); 
    sendBroadcast(intent); 
} 

и отправить он вернулся, но я все равно становлюсь нулевым. Чтобы проверить мой сервис, я использую оболочку adb:

adb shell am broadcast -a android.intent.action.SEND 
Broadcasting: Intent { act=android.intent.action.SEND } 
Broadcast completed: result=0 

Кто-нибудь знает, что не так в моем обслуживании?

+0

Является ли ваш широковещательный класс и внутри службы? –

+0

@ItzHoudini, нет, это внешний класс в одном пакете – novik

ответ

3

Вы можете увидеть здесь:

http://developer.android.com/reference/android/content/Intent.html

что ACTION_SEND это действие активности, он не может быть использован с приемником.

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

[править] еще какое-то объяснение: BroadcastReceiver with intent-filter for them?

+0

благодарит за ответ! Это косвенно помогло мне использовать другое решение. Вместо этого я использую [Сообщение] (http://developer.android.com/reference/android/os/Message.html). Это лучшее решение в моем случае. – novik

0

Попробуйте что-то вроде этого.

Метод отправки вещания, используемый в MyService

public static void sendSomeBroadcast(Context context, String topic) { 
    Intent actionIntent = new Intent(); 

    // I would use Constants for these Action/Extra values 
    actionIntent.setAction(ConstantClass.SEND_SOME_BROADCAST); 
    actionIntent.putExtra(ConstantClas.BROADCAST_RESULT, 10); 
    LocalBroadcastManager.getInstance(context).sendBroadcast(actionIntent); 
    } 

В действии

public void onStart(Intent intent, int startId) { 
    sendSomeBroadcast(); 
} 

BroadcastReceiver

public class MyStartServiceReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // do what you want with the intent, for example intent.getExtras().. 

     Intent intent1 = new Intent(context, MyService.class); 
     context.startService(intent1); 
    } 
} 

Binding приемник и прослушивания для конкретных действий

private void bindStartServiceReceiver() { 
      MyStartServiceReceiver startServiceReceiver = new MyStartServiceReceiver(); 

      //This may need to be changed to fit your application 
      LocalBroadcastManager.getInstance(this).registerReceiver(subscribeTopicReceiver, 
      new IntentFilter(ConstantClass.SEND_SOME_BROADCAST)); 
     } 
Смежные вопросы