我在其中一个应用程序中遇到小问题。它使用BroadCastReceiver
来检测呼叫何时结束,然后执行一些小型内务处理任务。这些必须延迟几秒钟,以允许用户查看一些数据并确保通话记录已更新。我目前使用handler.postDelayed()
为了这个目的:handler.postDelayed与AlarmManager vs
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。但是,我不确定性能影响(或其使用的资源)。
也许有一个更好的方法来确保所有的消息在线程死亡之前已经被处理,或者另一种方式来延迟这两位代码的执行。
谢谢
好了,就像我想 - 我只是不想浪费资源。我想我会和AlarmManager一起使用,并为这两项任务使用一个接收器。谢谢! – alibi 2011-03-31 21:15:32
好吧,实施它(比我想象的要容易),完美无瑕。再次感谢你! – alibi 2011-03-31 21:56:58