微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PackageInstaller失败后未调用OnNewIntent

如何解决PackageInstaller失败后未调用OnNewIntent

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

我的活动启动模式设置为Singletop。我从OnActivityResult调用InstallPackageAndroidQAndAbove(在此之前,我需要先卸载应用程序,然后检查是否在那里将其卸载了)。我还修改了该代码,以在创建PendingIntentFlags.UpdateCurrent对象期间传递PendingIntent标志。问题是成功安装APK或安装程序正在等待用户操作时,总是会正确调用OnNewIntent,然后执行一些操作。但是,当用户中止安装时,不会调用OnNewIntent(尽管确实会被调用)。我找不到任何有关这种行为的信息。我怎样才能解决这个问题?还是与我正在调试的设备有关(带有基于Android 10的Miui 12的小米Mi 9T Pro)?

当应用无法安装并停止该过程时,我需要显示一个警报对话框。解决方法是使用StartActivityForResult,然后在OnActivityResult中等待5秒钟,然后检查是否已安装应用程序。但是这种解决方法当然不好,因为如果安装过程超过5秒钟,则尽管会安装应用程序本身,但无论如何都会显示警报对话框。

解决方法

如您所见here,为了确保您的OnNewIntent被调用,您必须在创建PendingIntent.FLAG_UPDATE_CURRENT的过程中传递以下标志:PendingIntent目的。因此,如果您遵循的是共享的示例,则:

PendingIntent pendingIntent = PendingIntent.GetActivity(activity,intent,0);

应该是这样

PendingIntent pendingIntent = PendingIntent.GetActivity(activity,PendingIntentFlags.UpdateCurrent);
,

我做了比我的问题中描述的更好的解决方法。这仍然是一种解决方法,因为我找不到对这种奇怪行为的解释。

我唯一需要的就是通知安装失败。我声明了一个继承 PackageInstaller.SessionCallback 的类。它看起来像这样:

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 看起来像这样:

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,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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。