微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android 应用内更新不断要求更新

如何解决Android 应用内更新不断要求更新

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

为了做到这一点,我使用了一个应用内更新,我从 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,discoverActivity.this,"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}

我该如何解决

谢谢

解决方法

停止注册监听器,同时没有任何更新;这进入分支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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。