2017-04-23 88 views
0

我的服务:服务不听某些广播

@Override 
    public void onCreate() { 
     if (debug_mode) {Log.i(TAG,"onCreate");} 
     super.onCreate(); 
     // set receivers 
     m_filter.addAction("PREPARE_AUDIO"); 
     m_receiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       if (debug_mode) {Log.i(TAG,"broadcast received: " + intent.getAction());} 
       if (intent.getAction().equals("PREPARE_AUDIO")) { 
        set_up_audio(); 
       } 
      } 
     }; 
     registerReceiver(m_receiver, m_filter); 
    } 

和我的活动:

@Override 
protected void onStart() { 
     super.onCreate(savedInstanceState); 
     if (debug_mode) Log.i(TAG, "onCreate"); 
     setContentView(R.layout.activity_guide); 
     // start service 
     startService(new Intent(this, PlayerService.class)); 
} 
@Override 
protected void onStart() { 
     if (debug_mode) {Log.i(TAG,"onStart");} 
     super.onStart(); 
     // prepare audio 
     Intent intent = new Intent(); 
     intent.setAction("PREPARE_AUDIO"); 
     sendBroadcast(intent); 
} 

这不会引发我的服务BroadcastReceiver。如果我将代码放在onCreateonResume上,它将不会触发它。它会触发它,但是,如果放在例如与Button关联的某个Listener或活动的onStop回调。这是为什么?

+0

据推测,当onCreate(),onStart()或onResume()被调用时,你的服务还没有运行。 – CommonsWare

+0

以及我如何确保它正在运行?我使用启动服务的代码编辑了我的答案 –

+0

更简单的解决方案是不要尽快发送广播。你不应该这样做。如果你需要这个服务来做一些事情,可以在'onStartCommand()'中做。 – CommonsWare

回答

1

,而不是试图发送一个广播向右走,只是有服务做它的设置工作在其onCreate()onStartCommand()方法。

请注意,为此使用系统广播是一个相当糟糕的主意,除非您的服务与您的用户界面分离。即使那样,你也需要考虑安全性,因为任何应用都可以通过发送广播来告诉你的服务要做什么。

如果您的服务和用户界面将处于相同的过程中,请使用进程内事件总线(例如,LocalBroadcastManager,greenrobot的EventBus),这不仅可以提高安全性,还可以提高性能。