1

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>

インテントを受信すると、パッケージ情報の一部を含む通知を表示します。私の問題は、たとえばデバッグ中に新しいアプリを追加すると、から2つのインテントが受信PackageHandlerされるため、2つの通知が表示されることです。説明のために、これBroadcastReceiverは説明したインテントを処理し、インテントが送信されるたびにlogcatエントリを表示します。これは、アプリを更新するときに2回表示されます。

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

ただし、(別のインテントを処理することから)ログメッセージをすでに表示したことを追跡するソリューションが必要です。通知の観点から、オプションで、表示された後に余分な通知を削除することもできます。誰かが実用的な解決策を持っていますか?API1.5をサポートしていることに注意してください。

4

2 に答える 2

0

NotificationManager.notifyで同じ一意のIDを使用すると、新しい通知が古い通知に置き換わります。

于 2012-01-11T18:34:50.737 に答える
0

私が思いついた解決策は本当にうまくいきましたが、それを理解するのに苦労しました。多くの静的変数を含む別のクラス( S.javaと呼びましょう)で、 pidintegerと呼ばれるものを作成しました。次に、プロセスPIDを比較し、一致するかどうかを判断するメソッドを含めるように追加しました。ほとんどの場合、受信されるのは1つだけですが、これで保護するために2つまで持っています。このレシーバーへの呼び出しは一度に3回行ったことがないため、これはそれほど多くの呼び出しを処理するようには設計されていません。新しいコード(上記のコードに追加)は次のとおりです。BroadcastReceiversynchronizedintentsintent

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
于 2012-01-12T17:46:11.040 に答える