如何解决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 举报,一经查实,本站将立刻删除。