2012-08-24 5 views
1

Привет всем и благодарю вас за помощь! Начну с кодом
Так, класс с радиовещательного приемника заключается в следующем:Android BroadcastReceiver никогда не называется

public class MyService extends Service { 

    // ... 
    // ACTION 
    public static final String action = "com.mywebsite.myapp.package.class.action"; 
    // ... 
    public void onCreate() { 
     // SET BROADCAST RECEIVER 
     broadcastReceiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       String action = intent.getAction(); 
       Log.w("broadcast receiver", "action: " + action); 
       if (action.equals("**")) { 
        Log.w("broadcast receiver", "**"); 
       } 
      } 
     }; 
     // REGISTER BROADCAST 
     final IntentFilter myFilter = new IntentFilter(); 
     myFilter.addAction(action); 
     registerReceiver(this.broadcastReceiver, myFilter); 
    } 
    // .... 
} 

И я пытаюсь послать широковещательный таким образом из фрагмента

Intent myIntent = new Intent(getActivity() 
     .getApplicationContext(), MediaPlayerService.class); 
getActivity().startService(myIntent); 
myIntent = new Intent(getActivity().getApplicationContext(), 
     MediaPlayerService.class); 
myIntent.setAction(MyService.action); 
myIntent.putExtra("data", "*******"); 
getActivity().sendBroadcast(myIntent); 

Однако широковещательный приемник никогда не вызывается. Я могу сказать это из-за logcat: строка Log.w («широковещательный приемник», «действие:» + действие); никогда не называется. Как я могу решить?

Спасибо!

EDIT: код класса:

public class MediaPlayerService extends Service { 

    private MediaPlayer mediaPlayer = null; 
    private AudioManager audioManager; 
    private BroadcastReceiver broadcastReceiver; 
    private String absoluteFilePath; 
    private Boolean areThereAnyErrors = false; 
    private int savedVolume; 
    // ACTIONS 
    public static final String prepareAndPlayNewFile = "com.disgustingapps.player.AudioManagement.MediaPlayerService.prepareAndPlayNewFile"; 

    @Override 
    public void onCreate() { 
     Log.w("MediaPlayerService", "onCreate called"); 
     // SET BROADCAST RECEIVER 
     broadcastReceiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       String action = intent.getAction(); 
       Log.w("broadcast receiver", "action: " + action); 
       if (action.equals("prepareAndPlayNewFile")) { 
        Log.w("broadcast receiver", "prepareAndPlayNewFile"); 
        prepareAndPlayNewFile(intent 
          .getStringExtra("absoluteFilePath")); 
       } 
      } 
     }; 
     // REGISTER BROADCAST 
     final IntentFilter myFilter = new IntentFilter(); 
     myFilter.addAction(prepareAndPlayNewFile); 
     registerReceiver(this.broadcastReceiver, myFilter); 
    } 

    @Override 
    public void onDestroy() { 
     Log.w("MediaPlayerService", "onDestroy called"); 
     unregisterReceiver(broadcastReceiver); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.w("MediaPlayerService", "onStartCommand called"); 
     // We want this service to continue running until it is explicitly 
     // stopped, so return sticky. 
     return START_STICKY; 
    } 

    public void prepareAndPlayNewFile(String absoluteFilePath) { 
     // ...do something... 
    } 
} 
+1

Вы подтвердили, что ваша служба работает при попытке отправить трансляцию? Я предполагаю, что служба не зарегистрировала BroadcastReceiver перед отправкой трансляции. – Bobbake4

+0

Согласен с @ Bobbake4. Добавьте несколько дополнительных журналов в свою «Сервис», чтобы показать, как он регистрирует ресивер и добавляет некоторые из них в «Фрагмент», чтобы показать его отправку широковещательной передачи. – Squonk

+0

Я проверил оба, и они бегут! Так в чем же проблема? – user1315621

ответ

0

Причина, по которой вы не принимаете Intent, заключается в том, что приемник находится в onCreate(). context.startService() будет передавать только ActivityIntent до Service's onStartCommand(). Service уже был создан к тому времени (или должен иметь), поэтому попытка получить в onCreate() никогда не будет работать.

Подробнее here

Попытка получить в onStartCommand() будет работать только один раз (кажется). Но имея BroadcastReceiver в onStartCommand, вы получите только данные, если вы позвоните startService(). Поскольку вы все равно звоните, гораздо проще просто прорезать BroadcastReceiver и просто передать данные с помощью Intent, доставленного на Service s onStartCommand().

EDIT

@Override 
public void onCreate() { 
    Log.w("MediaPlayerService", "onCreate called"); 
} 

@Override 
public void onDestroy() { 
    Log.w("MediaPlayerService", "onDestroy called"); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.w("MediaPlayerService", "onStartCommand called");  

    String action = intent.getAction(); 
    Log.w("onStartCommand()", "action: " + action); 

    if (action.equals("prepareAndPlayNewFile")) { 
     prepareAndPlayNewFile(intent.getStringExtra("absoluteFilePath")); 
    } 

    // We want this service to continue running until it is explicitly 
    // stopped, so return sticky. 
    return START_STICKY; 
} 

Тогда просто сделать это:

Intent myIntent = new Intent(getActivity().getApplicationContext(), MediaPlayerService.class); 
myIntent.setAction("prepareAndPlayNewFile"); 
myIntent.putExtra("absoluteFilePath", "/path/"); 
startService(myIntent); 

startService():

Каждый вызов этого метода приведет к соответствующему вызову onStartCommand целевого сервиса (Intent, int, int) с намерением, заданным h ERE. Это обеспечивает удобный способ отправки заданий на службу без необходимости связывания и вызова его интерфейса.

+0

Я пробовал Но не работает. Может быть, потому, что мне нужно получать трансляцию после того, как служба была запущена, а служба запущена. Может быть, это причина? Спасибо – user1315621

+0

Но в этой точке зачем использовать трансляцию? – user1315621

+0

ах Я понимаю, что вы имеете в виду. Подождите, я попробую что-то – slinden77

1

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

Во-первых, вы регистрируя приемник в onCreate of the service, но у вас нет незарегистрированного события. Вы должны поместить широковещательный приемник в глобальную область вашего класса обслуживания и отменить регистрацию в onDestroy() (переопределить onDestroy и записать сообщение, чтобы подтвердить его останов)

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

Вы должны переопределить onStartCommand и вернуть START_STICKY, чтобы служба работала.

+0

Он возвращает START_STICKY! Я редактирую свой первый пост с кодом части урока относительно проблемы. Надеюсь, ты поможешь мне! И спасибо вам большое заблаговременно :) – user1315621

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