我有一个soundrecorder android线程,我需要知道录制时是否连接麦克风/耳机,所以我需要在thread.how中使用BroadcastReceiver()我可以注册吗? this.registerReceiver()不会工作,因为它只适用于活动。
如果在线程中使用broadcasereceivers不是一个好主意,那么解决方案是什么?
这里的代码可以在一个活动中工作,不会在一个线程内工作:
headsetReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i("Broadcast Receiver", action);
if ((action.compareTo(Intent.ACTION_HEADSET_PLUG)) == 0) // if
// the
// action
// match
// a
// headset
// one
{
int headSetState = intent.getIntExtra("state", 0); // get
// the
// headset
// state
// property
int hasMicrophone = intent.getIntExtra("microphone", 0);// get
// the
// headset
// microphone
// property
if ((headSetState == 0) && (hasMicrophone == 0)) // headset
// was
// unplugged
// &
// has
// no
// microphone
{
// do whatever
}
}
}
};
this.registerReceiver(headsetReceiver, new IntentFilter(
Intent.ACTION_HEADSET_PLUG));
答案 0 :(得分:1)
您需要将上下文传递给Thread构造函数,然后使用它来注册广播接收器:
//this.ctx is passed to the Thread constructor
this.ctx.registerReceiver(headsetReceiver, new IntentFilter(
Intent.ACTION_HEADSET_PLUG));
不要忘记在Thread中的finally {}中取消注册接收器,否则可能会发生泄漏:
finally{
ctx.unregisterReceiver(headsetReceiver);
}
为了更改主线程内的UI(例如活动),您需要设置一个处理程序