В Android, как показать одно уведомление при обработке нескольких намерений? - PullRequest
1 голос
/ 11 января 2012

У меня есть BroadcastReceiver для обработки новых или измененных приложений:

<receiver android:name=".PackageHandler" >
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_ADDED" />
            <action android:name="android.intent.action.PACKAGE_CHANGED" />
            <action android:name="android.intent.action.PACKAGE_REPLACED" />
            <data android:scheme="package" />
        </intent-filter>
</receiver>

При получении намерения я показываю уведомление, содержащее некоторую информацию о пакете. Моя проблема в том, что когда я добавляю новое приложение, например, во время отладки, из PackageHandler получаются два намерения, и, таким образом, отображаются два уведомления. Чтобы проиллюстрировать это, BroadcastReceiver, который обрабатывает обсуждаемые намерения, будет показывать запись logcat при каждой отправке намерения, что в два раза больше, когда я обновляю приложение:

public class PackageHandler extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("", "Intent Received: " + intent.getAction());
        if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
            Log.i("Intent Received", intent.getAction());
        }
        else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
            Log.i("Intent Received", intent.getAction());
        }
        else if (intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED)) {
            Log.i("Intent Received", intent.getAction());
        }

    }//onReceive
}//PackageHandler

Однако мне нужно решение, которое отслеживает уже показанное сообщение журнала (от обработки других намерений). С точки зрения уведомлений я также мог бы при желании удалить дополнительные уведомления после их отображения. У кого-нибудь есть рабочее решение? Обратите внимание, что я поддерживаю API 1.5.

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Решение, которое я придумала, работает очень хорошо, но мне было непросто разобраться.В отдельном классе, который содержит много статических переменных (назовем это S.java ), я создал integer с именем pid .Затем я добавил в свой BroadcastReceiver метод synchronized, который сравнивает PID процесса и решает, совпадает ли один из них.В большинстве случаев только один из intents получен, однако у меня было до двух, от которых это защищает.У меня никогда не было трех intent вызовов на этот приемник одновременно, поэтому он не предназначен для обработки такого количества.Новый код (добавление к вышеуказанному коду) выглядит следующим образом:

public class PackageHandler extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (!getPID()) {
            return;
        }
        if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
            Log.i("Intent Received", intent.getAction());
        }
        else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
            Log.i("Intent Received", intent.getAction());
        }
        else if (intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED)) {
            Log.i("Intent Received", intent.getAction());
        }
    }//onReceive

    public synchronized boolean getPID() {
       ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
       List<RunningAppProcessInfo> raps = am.getRunningAppProcesses();
       int pid = 0;
       for (RunningAppProcessInfo rap : raps) {
           if (rap.processName.equals("com.example.android")) {//change to your package
               pid = rap.pid;
               break;
           }
       }
       if (pid == S.pid) {
           Log.i("", "PIDs match");
           S.pid = 0;
           return false;
       }
       else {
           Log.i("", "Non-Matching PIDs");
           S.pid = pid;
           return true;
       }
   }//getPID

}//PackageHandler
0 голосов
/ 11 января 2012

Если мы используем тот же уникальный идентификатор в NotificationManager.notify , новое уведомление заменит старое уведомление.

...