在Android上如何阻止应用程序更新时触发广播接收器

3

我必须在设备上安装或卸载新应用程序时显示提示,目前它工作正常。唯一的问题是,即使应用程序已更新,提示也会出现。 如何阻止BroadCastReceiver在应用程序更新时触发。

<receiver android:name=".WeepingReceiver">
    <intent-filter android:priority="100">
         <action android:name="android.intent.action.PACKAGE_ADDED" />
         <action android:name="android.intent.action.PACKAGE_REMOVED" />

         <data android:scheme="package" />
    </intent-filter>
</receiver>

广播

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_PACKAGE_INSTALL)
            || intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
            context.startActivity(new Intent(context, NewAppActivity.class).
            setFlags(Intent.FLAG_ACTIVITY_NEW_TASK).putExtra(Utility.NEW_PACKAGE_NAME, packageName));
}
3个回答

3

试试这个

Bundle extras = intent.getExtras();
if (extras.containsKey(Intent.EXTRA_REPLACING) && extras.getBoolean(Intent.EXTRA_REPLACING))
{
//do nothing here it is condition of updating your existing app
}else
{
//do your code here
}

以上解决方案对我有用,谢谢。但现在当应用程序被卸载时,我会收到活动。如何处理这个问题?请告诉我。 - user8147458
只需检查删除条件是否为: if (extras.containsKey(Intent.ACTION_PACKAGE_REMOVED) && extras.getBoolean(Intent.ACTION_PACKAGE_REMOVED)){} 并且在此条件下不执行任何操作或编写适合您的条件。 - Mohd Saquib

0

尝试将您的if条件更改为

if (!intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED) &&
       (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED))) {

      context.startActivity(new Intent(context, NewAppActivity.class)
          .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
          .putExtra(Utility.NEW_PACKAGE_NAME, packageName));
}

和清单

<receiver android:name=".WeepingReceiver">
    <intent-filter android:priority="100">
         <action android:name="android.intent.action.PACKAGE_ADDED" />
         <action android:name="android.intent.action.PACKAGE_REMOVED" />
         <action android:name="android.intent.action.PACKAGE_REPLACED" />
         <data android:scheme="package" />
    </intent-filter>
</receiver>

PACKAGE_REPLACED - Tim
@TimCastelijns 看看我的 if 条件,那里检查了不更新条件,如果更新应用程序,条件永远不会成立,首先要仔细检查整个解决方案,不要聪明地对别人的答案进行投票。 - Mohd Saquib
@TimCastelijns 谢谢 - Mohd Saquib

0

应用程序更新是重新安装新应用程序,因此您的接收器将接收到事件PACKAGE_ADDED,这是正确的。因此,您无法停止广播接收事件。

但是,您可以通过检查先前是否存在包名称来验证意图是否正在更新。您可以拥有已安装应用程序的包名称列表并进行存储。然后像您正在执行的那样进行检查:

if (intent.getAction().equals(Intent.ACTION_PACKAGE_INSTALL)
            || intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)
            || !packageList.contains(packageName))

您可以通过以下方式获取包列表

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
   packageList.add(packageInfo.packageName);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接