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>

当收到一个意图时,我会显示一个包含一些包信息的通知。我的问题是,当我添加一个新应用程序时,例如在调试时,从 接收到两个意图PackageHandler,因此显示两个通知。为了说明,BroadcastReceiver处理讨论的意图的 this 将在每次发送意图时显示一个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。

4

2 回答 2

0

我想出的解决方案效果很好,但我很难弄清楚。在一个包含许多静态变量(我们称之为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
于 2012-01-12T17:46:11.040 回答
0

如果我们在NotificationManager.notify中使用相同的唯一 ID ,则新通知将替换旧通知。

于 2012-01-11T18:34:50.737 回答