我使用以下代码安装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秒,那么无论如何都会显示警告对话框,尽管应用程序本身将被安装。
发布于 2020-12-31 03:20:36
我的解决办法比我问题中描述的要好得多。不过,这仍然是一个解决办法,因为我找不到对这种奇怪行为的解释。
我需要的唯一的东西,实际上是通知安装失败。我声明了一个继承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, 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);
}
发布于 2020-08-23 14:50:38
您可以看到here,为了确保调用OnNewIntent
,必须在创建PendingIntent
对象期间传递以下标志:PendingIntent.FLAG_UPDATE_CURRENT
。因此,如果您遵循您所分享的示例,则如下所示:
PendingIntent pendingIntent = PendingIntent.GetActivity(activity, 0, intent, 0);
应该是这样:
PendingIntent pendingIntent = PendingIntent.GetActivity(activity, 0, intent, PendingIntentFlags.UpdateCurrent);
https://stackoverflow.com/questions/63547423
复制相似问题