我做了一个BrodcastReceiver来说出这样的信息:接听电话,电话响了。
BroadcastReceiver代码:
@Override
public void onReceive(Context context, Intent intent) {
cont = context;
tts = new Speak(cont);
String action = intent.getAction();
if (action.equalsIgnoreCase("android.intent.action.PHONE_STATE")) {
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_RINGING)) {
incoming_number = intent.getExtras().getString(
"incoming_number");
falador = new Thread() {
@Override
public void run() {
try {
if (!this.isInterrupted()) {
while (true) {
sleep(5000);
h.post(repeater);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
falador.start();
} else {
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_IDLE)) {
h.removeCallbacks(repeater);
falador.interrupt();
}
}
}
}
但是,事件IDLE不会停止线程。你能救我吗?
谢谢, 马特乌斯
答案 0 :(得分:0)
您可以使用:
falador = new Thread() {
@Override
public void run() {
try {
while (!Thread.interrupted()) {
sleep(5000);
h.post(repeater);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
然后当你打断它会停止线程
答案 1 :(得分:0)
这个问题很老但需要答案。 BroadcastReceiver
在应用程序进程的主线程上运行,onReceive
方法的生命周期非常短。您可以认为Android系统在后台创建并运行和销毁此接收器类型的对象:
BroadcastReceiver receiver = new YourReceiver();
receiver.onReceive(context, intent);
System.gc();
此方法完成后,相关对象(接收方)变得容易进行垃圾回收。这意味着系统可以立即杀死创建/启动/连接到此接收器的任何内容。所以你不应该(实际上不能)在onReceive
方法中进行任何异步操作。 Receiver Lifecyle和onReceive(context, intent)强调这种情况。