我的一个应用程序中有一个小问题。它使用BroadCastReceiver来检测呼叫何时结束,然后执行一些次要的内务处理任务。这些必须延迟几秒钟,以允许用户查看一些数据并确保呼叫日志已更新。我目前正在为此目的使用handler.postDelayed()

public class CallEndReceiver extends BroadcastReceiver {

@Override
public void onReceive(final Context context, final Intent intent) {
    if (DebugFlags.LOG_OUTGOING)
        Log.v("CallState changed "
                + intent.getStringExtra(TelephonyManager.EXTRA_STATE));
    if (intent.getStringExtra(TelephonyManager.EXTRA_STATE)
            .equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) {
        SharedPreferences prefs = Utils.getPreferences(context);
        if (prefs.getBoolean("auto_cancel_notification", true)) {
            if (DebugFlags.LOG_OUTGOING)
                Log.v("Posting Handler to remove Notification ");
            final Handler mHandler = new Handler();
             final Runnable mCancelNotification = new Runnable() {
                   public void run() {
                        NotificationManager notificationMgr = (NotificationManager) context
                        .getSystemService(Service.NOTIFICATION_SERVICE);
                notificationMgr.cancel(12443);
                if (DebugFlags.LOG_OUTGOING)
                    Log.v("Removing Notification ");
                   }
                };
                mHandler.postDelayed(mCancelNotification, 4000);


        }
        final Handler updateHandler = new Handler();
         final Runnable mUpdate = new Runnable() {
               public void run() {
        if (DebugFlags.LOG_OUTGOING)
            Log.v("Starting updateService");
        Intent newBackgroundService = new Intent(context,
                CallLogUpdateService.class);
        context.startService(newBackgroundService);
               }
               };
               updateHandler.postDelayed(mUpdate, 5000);

        if (DebugFlags.TRACE_OUTGOING)
            Debug.stopMethodTracing();
        try
        {
        // Stopping old Service
        Intent backgroundService = new Intent(context,
                NetworkCheckService.class);
        context.stopService(backgroundService);
        context.unregisterReceiver(this);
        }
        catch(Exception e)
        {
            Log.e("Fehler beim Entfernen des Receivers", e);
        }
    }

}


}

现在,我有一个问题,该设置大约可以在90%的时间内工作。在大约10%的情况下,通知不会被删除。我怀疑线程在消息队列处理消息/可运行之前就死了。

我现在正在考虑postDelayed()的替代方法,显然我的选择之一是AlarmManager。但是,我不确定性能的影响(或其使用的资源)。

也许有更好的方法来确保在线程死亡之前已处理所有消息,或者有另一种方法可以延迟这两位代码的执行。

谢谢

最佳答案

我目前正在为此使用handler.postDelayed():


假设BroadcastReceiver由清单中的过滤器触发,这不是一个好主意。


  现在,我有一个问题,该设置大约可以在90%的时间内工作。在大约10%的情况下,通知不会被删除。我怀疑线程在消息队列处理消息/可运行之前就死了。


更准确地说,该过程将随一切终止。


  我现在正在考虑postDelayed()的替代方法,显然我的选择之一是AlarmManager。但是,我不确定性能的影响(或其使用的资源)。


它没有那么坏。另一种可能性是在IntentService中延迟工作-通过调用startService()触发-使它在其后台线程上睡眠几秒钟。

10-04 10:10