アプリの 1 つに小さな問題があります。を使用し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()が、私の選択肢の 1 つは明らかに AlarmManager です。ただし、パフォーマンスへの影響 (または使用するリソース) についてはわかりません。
おそらく、スレッドが終了する前にすべてのメッセージが処理されたことを確認するより良い方法や、これら 2 ビットのコードの実行を遅らせる別の方法があるでしょう。
ありがとうございました