首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OnNewIntent在PackageInstaller失败后不被调用

OnNewIntent在PackageInstaller失败后不被调用
EN

Stack Overflow用户
提问于 2020-08-23 13:21:01
回答 2查看 483关注 0票数 0

我使用以下代码安装APK:https://stackoverflow.com/a/61889386/14152249

我的活动启动模式被设置为SingleTop。我从InstallPackageAndroidQAndAbove调用OnActivityResult (我需要在此之前卸载应用程序,并检查它是否已卸载)。此外,在创建PendingIntentFlags.UpdateCurrent对象期间,我修改了该代码以传递PendingIntent标志。问题是当APK成功安装或者安装程序等待用户操作时,OnNewIntent总是被正确地调用,然后我做一些事情。但是,当用户中止安装时,不会调用OnNewIntent (偶尔也会调用它)。关于这种行为,我什么也找不到。我怎么才能解决这个问题?或者它可能与我正在调试的设备有关(小米米9T Pro与MIUI 12基于Android 10)?

当应用程序安装和停止进程失败时,我需要显示一个警告对话框。作为解决办法,我使用StartActivityForResult,然后在OnActivityResult中等待5秒,并检查是否安装了应用程序。当然,这种解决方法是不好的,因为如果安装时间超过5秒,那么无论如何都会显示警告对话框,尽管应用程序本身将被安装。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-31 03:20:36

我的解决办法比我问题中描述的要好得多。不过,这仍然是一个解决办法,因为我找不到对这种奇怪行为的解释。

我需要的唯一的东西,实际上是通知安装失败。我声明了一个继承PackageInstaller.SessionCallback的类。看起来是这样的:

代码语言:javascript
运行
复制
public class PackageInstallObserver : PackageInstaller.SessionCallback
{
    private PackageInstaller PackageInstaller { get; }
    public event EventHandler InstallFailed;

    public PackageInstallObserver(PackageInstaller packageInstaller) => PackageInstaller = packageInstaller;

    public override void OnActiveChanged(int sessionId, bool active) { }

    public override void OnBadgingChanged(int sessionId) { }

    public override void OnCreated(int sessionId) { }

    public override void OnFinished(int sessionId, bool success)
    {
        PackageInstaller.UnregisterSessionCallback(this);
        PackageInstaller.Dispose();
        if (!success) InstallFailed?.Invoke(this, EventArgs.Empty);
    }

    public override void OnProgressChanged(int sessionId, float progress) { }
}

然后,在我的InstallPackageAndroidQAndAbove方法中,我创建了该类的一个实例,并将其传递给packageInstaller.RegisterSessionCallback方法。现在InstallPackageAndroidQAndAbove看起来是这样的:

代码语言:javascript
运行
复制
public void InstallPackageAndroidQAndAbove(Android.Net.Uri apkUri)
{
   var packageInstaller = PackageManager.PackageInstaller;
   var sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
   int sessionId = packageInstaller.CreateSession(sessionParams);
   var session = packageInstaller.OpenSession(sessionId);

   AddApkToInstallSession(apkUri, session);
        
   // Create an install status receiver.
   var intent = new Intent(this, this.Class);
   intent.SetAction(PACKAGE_INSTALLED_ACTION);
   var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.UpdateCurrent);
   var statusReceiver = pendingIntent.IntentSender;

   // Create an observer and register it
   var observer = new PackageInstallObserver(packageInstaller);
   observer.InstallFailed += OnInstallFailed; // Subscribe to event
   packageInstaller.RegisterSessionCallback(observer);

   // Commit the session (this will start the installation workflow).
   session.Commit(statusReceiver);
}
票数 0
EN

Stack Overflow用户

发布于 2020-08-23 14:50:38

您可以看到here,为了确保调用OnNewIntent,必须在创建PendingIntent对象期间传递以下标志:PendingIntent.FLAG_UPDATE_CURRENT。因此,如果您遵循您所分享的示例,则如下所示:

代码语言:javascript
运行
复制
PendingIntent pendingIntent = PendingIntent.GetActivity(activity, 0, intent, 0);

应该是这样:

代码语言:javascript
运行
复制
PendingIntent pendingIntent = PendingIntent.GetActivity(activity, 0, intent, PendingIntentFlags.UpdateCurrent);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63547423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档