BroadcastReceiver不会停止线程

时间:2012-03-28 12:37:56

标签: android

我做了一个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不会停止线程。你能救我吗?

谢谢, 马特乌斯

2 个答案:

答案 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 LifecyleonReceive(context, intent)强调这种情况。