You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android原生Java:用户拒绝后延迟X天再次请求更新与应用内评价

Android应用内更新与评价的延迟请求解决方案

问题背景

作为Android原生Java开发新手,你遇到两个需求:

  • 用户取消软更新后,每次打开APP都会收到更新请求,希望设置自定义天数后再询问;
  • 用户拒绝应用内评价(IN-APP-REVIEW)后,延迟X天再次触发评价请求。

一、应用内更新(Flexible类型)延迟处理

核心思路:用SharedPreferences记录用户取消更新的时间,每次启动APP时,先判断距离上次取消更新是否已过设定天数,再决定是否触发更新请求。

步骤与代码修改

  1. 定义常量与工具方法
    在你的Activity中添加以下内容:
// 存储用户取消更新的时间戳键
private static final String KEY_LAST_CANCEL_UPDATE = "last_cancel_update";
// 延迟询问的天数(可自定义,示例为7天)
private static final long UPDATE_DELAY_DAYS = 7;
// 一天的毫秒数
private static final long ONE_DAY_MILLIS = 24 * 60 * 60 * 1000L;

private SharedPreferences getUpdatePrefs() {
    return getSharedPreferences("update_prefs", MODE_PRIVATE);
}

// 记录用户取消更新的时间
private void saveCancelUpdateTime() {
    getUpdatePrefs().edit()
            .putLong(KEY_LAST_CANCEL_UPDATE, System.currentTimeMillis())
            .apply();
}

// 判断是否可以再次请求更新
private boolean canRequestUpdateAgain() {
    long lastCancelTime = getUpdatePrefs().getLong(KEY_LAST_CANCEL_UPDATE, 0);
    if (lastCancelTime == 0) {
        // 从未取消过更新,直接允许
        return true;
    }
    // 计算当前时间与上次取消的时间差
    long timeDiff = System.currentTimeMillis() - lastCancelTime;
    return timeDiff >= UPDATE_DELAY_DAYS * ONE_DAY_MILLIS;
}
  1. 在用户取消更新时记录时间
    修改onActivityResult方法:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RC_APP_UPDATE && resultCode != RESULT_OK) {
        Toast.makeText(this, "Cancelado", Toast.LENGTH_SHORT).show();
        // 记录取消更新的时间
        saveCancelUpdateTime();
    }
}
  1. 修改更新触发逻辑
    更新activateUpdate方法的判断条件:
void activateUpdate(){
    final Handler handler = new Handler(Looper.getMainLooper());
    handler.postDelayed(() -> {
        AppUpdateManager mAppUpdateManager = AppUpdateManagerFactory.create(this);
        Task<AppUpdateInfo> appUpdateInfoTask = mAppUpdateManager.getAppUpdateInfo();

        appUpdateInfoTask.addOnSuccessListener(result -> {
            if (result.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
                    && result.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)
                    // 新增判断:是否满足延迟天数要求
                    && canRequestUpdateAgain()) {
                try {
                    mAppUpdateManager.startUpdateFlowForResult(result, AppUpdateType.FLEXIBLE, MainActivity.this, RC_APP_UPDATE);
                } catch (IntentSender.SendIntentException e) {
                    System.out.println(e.getMessage());
                }
            }
        });
        mAppUpdateManager.registerListener(installStateUpdatedListener);
    }, 9000);
}

二、应用内评价(In-App Review)延迟处理

核心思路:用SharedPreferences记录上次评价请求的时间(无论用户是否完成评价),下次启动时判断是否已过设定延迟天数,同时结合已安装天数的条件触发请求。

步骤与代码修改

  1. 定义常量与工具方法
    在你的Activity中添加以下内容:
// 存储上次评价请求的时间戳键
private static final String KEY_LAST_REVIEW_REQUEST = "last_review_request";
// 延迟询问的天数(可自定义,示例为14天)
private static final long REVIEW_DELAY_DAYS = 14;

private SharedPreferences getReviewPrefs() {
    return getSharedPreferences("review_prefs", MODE_PRIVATE);
}

// 记录上次评价请求的时间
private void saveLastReviewRequestTime() {
    getReviewPrefs().edit()
            .putLong(KEY_LAST_REVIEW_REQUEST, System.currentTimeMillis())
            .apply();
}

// 判断是否可以再次触发评价请求
private boolean canRequestReviewAgain() {
    long lastRequestTime = getReviewPrefs().getLong(KEY_LAST_REVIEW_REQUEST, 0);
    if (lastRequestTime == 0) {
        // 从未请求过评价,直接允许
        return true;
    }
    // 计算当前时间与上次请求的时间差
    long timeDiff = System.currentTimeMillis() - lastRequestTime;
    return timeDiff >= REVIEW_DELAY_DAYS * ONE_DAY_MILLIS;
}
  1. 在评价流完成后记录时间
    修改activateReviewInfo方法:
void activateReviewInfo()
{
    final Handler handler = new Handler(Looper.getMainLooper());
    handler.postDelayed(() -> {
        manager = ReviewManagerFactory.create(this);

        Task<ReviewInfo> request = manager.requestReviewFlow();
        request.addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                reviewInfo = task.getResult();
                Task<Void> flow = manager.launchReviewFlow(this, reviewInfo);

                flow.addOnCompleteListener(result -> {
                    // 无论用户是否评价/关闭,都记录请求时间
                    saveLastReviewRequestTime();
                });
            } else {
                // 请求失败也记录时间,避免频繁请求
                saveLastReviewRequestTime();
            }
        });

        request.addOnFailureListener(e -> {
            System.out.println(e.getMessage());
            saveLastReviewRequestTime();
        });
    }, 15000);
}
  1. 修改评价触发条件
    更新onCreate中的判断逻辑:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(null);
    ReviewsManager reviewsManager = new ReviewsManager();
    // 同时满足:已安装7天以上,且满足评价延迟天数要求
    if (reviewsManager.getDaysAppInstaled(this) >= 7 && canRequestReviewAgain()) {
        activateReviewInfo();
    }
    activateUpdate();
}

内容的提问来源于stack exchange,提问作者Vithor Carlos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:45:38