我的服务:
@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
。如果我将代码放在onCreate
或onResume
上,它也不会触发它。然而,它会触发它,如果放入,例如与某个Listener
关联的Button
或活动的onStop
回调。那是为什么?
答案 0 :(得分:1)
不要试图立即发送广播,而是让服务按照onCreate()
或onStartCommand()
方法进行设置。
请注意,使用系统广播是一个相当不错的主意,除非您的服务与UI分开。即使这样,你也需要考虑安全性,因为任何应用都可以通过发送广播来告诉你的服务做什么。
如果您的服务和用户界面处于同一过程中,请使用进程内事件总线(例如LocalBroadcastManager
,greenrobot的EventBus),这不仅是为了提高安全性,还为了提高性能。