我有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。
答案 0 :(得分:0)
如果我们在NotificationManager.notify中使用相同的唯一ID,则新通知将替换旧通知。
答案 1 :(得分:0)
我提出的解决方案效果非常好,但我很难搞清楚。在一个单独的类中,它包含许多 static 变量(我们称之为 S.java ),我创建了一个名为 pid的integer
。然后我添加到我的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