服务不听某些广播

时间:2017-04-23 16:08:41

标签: android service

我的服务:

    @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上,它也不会触发它。然而,它会触发它,如果放入,例如与某个Listener关联的Button或活动的onStop回调。那是为什么?

1 个答案:

答案 0 :(得分:1)

不要试图立即发送广播,而是让服务按照onCreate()onStartCommand()方法进行设置。

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

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