【问题标题】:Android in-app update keeps asking to updateAndroid 应用内更新不断要求更新
【发布时间】:2021-05-09 20:34:38
【问题描述】:

我需要在我的应用程序中进行一些重要的更新,我想确保我的应用程序中的所有用户都会下载它。

为此,我使用了应用内更新,我从here 那里得到了答案

基本上我做的如下:

build.gradle 中添加了以下内容:

implementation 'com.google.android.play:core:1.10.0'

在我的课堂内我添加了:

private AppUpdateManager mAppUpdateManager;
private static final int RC_APP_UPDATE = 11;

@Override
protected void onStart() {
    super.onStart();
    mAppUpdateManager = AppUpdateManagerFactory.create( this );
    Task<AppUpdateInfo> appUpdateInfoTask = mAppUpdateManager.getAppUpdateInfo();
    appUpdateInfoTask.addOnSuccessListener( appUpdateInfo -> {
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
                && appUpdateInfo.isUpdateTypeAllowed( AppUpdateType.IMMEDIATE )) {
            try {
                mAppUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, RC_APP_UPDATE );
                Log.d( "TEST", "HERE1" );
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
                Log.d( "TEST", "HERE2" );
            }
        } else if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
            Log.d( "TEST", "HERE3" );
        }
    } );
}


InstallStateUpdatedListener installStateUpdatedListener = new
        InstallStateUpdatedListener() {
            @Override
            public void onStateUpdate(InstallState state) {
                if (state.installStatus() == InstallStatus.INSTALLED) {
                    if (mAppUpdateManager != null) {
                        mAppUpdateManager.unregisterListener( installStateUpdatedListener );
                        Log.d( "TEST", "HERE4" );
                    }
                }
            }
        };

@Override
protected void onResume() {
    super.onResume();
    mAppUpdateManager.getAppUpdateInfo().addOnSuccessListener( appUpdateInfo -> {
        if (appUpdateInfo.updateAvailability()
                == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
            try {
                mAppUpdateManager.startUpdateFlowForResult(
                        appUpdateInfo, AppUpdateType.IMMEDIATE, DiscoverActivity.this, RC_APP_UPDATE );
                Log.d( "TEST", "HERE5" );
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
                Log.d( "TEST", "HERE6" );
            }

        }
    } );
}

@Override
protected void onStop() {
    if (mAppUpdateManager != null) {
        mAppUpdateManager.unregisterListener(installStateUpdatedListener);
        Log.d( "TEST", "HERE7" );
    }
    super.onStop();
}

现在,我已经使用内部测试来确保它可以正常工作,而且当我打开应用程序时,它确实显示了我需要更新应用程序的屏幕。更新后,应用会重新打开,但会要求我再次更新,以此类推。

为什么会这样?据我了解,unregisterListener 应该已经解决了。

通过调试代码,我看到它一直输入“HERE1”和“HERE7”,并且没有输入任何侦听器或类似的东西。从另一个测试来看,它永远不会将 state.installStatus() 更改为 INSTALLED 并且在日志中它说:

InstallState{installStatus=5, bytesDownloaded=0, totalBytesToDownload=0, installErrorCode=-100, packageName=com.xx.yy}

我该如何解决?

谢谢

【问题讨论】:

    标签: java android in-app-update


    【解决方案1】:

    停止注册监听器,此时没有什么可更新的;这进入分支appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE

    mAppUpdateManager.registerListener(installStateUpdatedListener);
    

    为这个应用注册一个监听器,接收自我更新操作的状态变化

    而注销监听器的时间通常是InstallStatus.INSTALLED:

    appUpdateInfo.installStatus() == InstallStatus.INSTALLED
    

    https://developer.android.com/guide/playcore/in-app-updates/kotlin-java
    https://gist.github.com/saikiran91/6788ad4d00edca30dad3f51aa47a4c5c

    另外,super.onStop() 应该总是最后调用。

    【讨论】:

    • 你的意思是我应该把 registerListener 插入 if 的 if (AppUpdateIndo.updateAvailability...?
    • appUpdateInfo 应该知道是否需要更新;我不是特别确定进入哪个分支,但将它移到那里似乎是有道理的。因为否则应用程序会重新启动并立即再次注册侦听器,这可能不是预期的行为。
    • 是的,我明白了。我试图将它移到那里,但它仍然进入 appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE,似乎它不明白该更新不可用。
    • 都不起作用 =/ 它永远不会进入 state.installStatus() == InstallStatus.INSTALLED
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多