[英]OnNewIntent is not called after PackageInstaller failure
我使用此代碼安裝 APK: https : //stackoverflow.com/a/61889386/14152249
我的活動啟動模式設置為 SingleTop。 我從 OnActivityResult 調用 InstallPackageAndroidQAndAbove (我需要在此之前卸載應用程序並檢查它是否在那里卸載)。 我還修改了該代碼以在創建PendingIntent
對象期間傳遞PendingIntentFlags.UpdateCurrent
標志。 問題是當 APK 成功安裝或安裝程序正在等待用戶操作時, OnNewIntent 總是被正確調用,然后我做一些事情。 但是當用戶中止安裝時,不會調用 OnNewIntent(雖然偶爾會調用它)。 我找不到關於這種行為的任何信息。 我怎樣才能解決這個問題? 或者可能與我正在調試的設備有關(小米米 9T Pro 和基於 Android 10 的 MIUI 12)?
當應用程序無法安裝並停止該過程時,我需要顯示一個警報對話框。 作為一種解決方法,我使用 StartActivityForResult 然后在 OnActivityResult 中等待 5 秒鍾並檢查是否安裝了應用程序。 但這種解決方法當然不好,因為如果安裝時間超過 5 秒,那么盡管會安裝應用程序本身,但無論如何都會顯示警報對話框。
正如你在這里看到的,為了確保你的OnNewIntent
被調用,你必須在PendingIntent
對象的創建過程中傳遞這個標志: PendingIntent.FLAG_UPDATE_CURRENT
。 因此,如果您遵循您共享的示例,則:
PendingIntent pendingIntent = PendingIntent.GetActivity(activity, 0, intent, 0);
應該是這樣的:
PendingIntent pendingIntent = PendingIntent.GetActivity(activity, 0, intent, 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, 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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.