簡體   English   中英

PackageInstaller 失敗后不調用 OnNewIntent

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM