Android原生Java:用户拒绝后延迟X天再次请求更新与应用内评价
Android应用内更新与评价的延迟请求解决方案
问题背景
作为Android原生Java开发新手,你遇到两个需求:
- 用户取消软更新后,每次打开APP都会收到更新请求,希望设置自定义天数后再询问;
- 用户拒绝应用内评价(IN-APP-REVIEW)后,延迟X天再次触发评价请求。
一、应用内更新(Flexible类型)延迟处理
核心思路:用SharedPreferences记录用户取消更新的时间,每次启动APP时,先判断距离上次取消更新是否已过设定天数,再决定是否触发更新请求。
步骤与代码修改
- 定义常量与工具方法
在你的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; }
- 在用户取消更新时记录时间
修改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(); } }
- 修改更新触发逻辑
更新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记录上次评价请求的时间(无论用户是否完成评价),下次启动时判断是否已过设定延迟天数,同时结合已安装天数的条件触发请求。
步骤与代码修改
- 定义常量与工具方法
在你的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; }
- 在评价流完成后记录时间
修改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); }
- 修改评价触发条件
更新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
相关产品推荐
相关产品推荐

