Android内购SharedPreferences存储后跨类调用及支付校验问题
嘿,既然你已经把购买状态成功存在SharedPreferences里了,那在另一个类里读取判断就很简单啦!我分两种常见场景给你写具体代码:
首先先确认你的存储逻辑(参考)
先假设你在PremiumActivity的购买成功回调里是这么存状态的(如果你的逻辑不一样,后面读取时保持文件名和key一致就行):
// 购买成功后调用这段代码存入状态 SharedPreferences purchasePrefs = getSharedPreferences("PurchaseData", MODE_PRIVATE); SharedPreferences.Editor editor = purchasePrefs.edit(); editor.putBoolean("hasPurchasedPremium", true); editor.apply(); // 异步提交,比commit()更适合主线程
场景1:在普通Java类(非Activity/Fragment)中读取
普通类没有自带的Context,所以需要传入Context实例,注意尽量用Application Context避免内存泄漏:
public class PremiumFeatureManager { private final Context appContext; // 构造方法传入Context,建议传application context public PremiumFeatureManager(Context context) { this.appContext = context.getApplicationContext(); } public void handlePremiumTask() { // 获取和存储时同名的SharedPreferences实例 SharedPreferences prefs = appContext.getSharedPreferences("PurchaseData", Context.MODE_PRIVATE); // 读取支付状态,默认值设为false(未购买) boolean isPremiumUser = prefs.getBoolean("hasPurchasedPremium", false); if (isPremiumUser) { // 已支付,执行你的专属任务 activatePremiumFeatures(); } else { // 未支付,执行引导购买或限制功能的逻辑 restrictNonPremiumAccess(); } } private void activatePremiumFeatures() { // 这里写付费后的具体逻辑,比如解锁高级功能、加载专属内容 Log.d("PremiumManager", "已解锁所有付费功能"); } private void restrictNonPremiumAccess() { // 比如提示用户购买,或者隐藏付费内容 Toast.makeText(appContext, "请先解锁付费权限哦", Toast.LENGTH_SHORT).show(); } }
在Activity里调用这个类的方式:
// 在任意Activity中 PremiumFeatureManager featureManager = new PremiumFeatureManager(this); featureManager.handlePremiumTask();
场景2:在另一个Activity/Fragment中读取
这种情况更简单,直接用自身的Context获取SharedPreferences就行:
public class HomeActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); checkAndApplyPremiumStatus(); } private void checkAndApplyPremiumStatus() { SharedPreferences prefs = getSharedPreferences("PurchaseData", MODE_PRIVATE); boolean isPurchased = prefs.getBoolean("hasPurchasedPremium", false); if (isPurchased) { // 执行付费后操作,比如隐藏广告、显示专属按钮 findViewById(R.id.home_premium_btn).setVisibility(View.VISIBLE); findViewById(R.id.home_ad_banner).setVisibility(View.GONE); } } }
几个重要提醒
- 一定要保证SharedPreferences的文件名和存储时的完全一致,key值也要对应上,不然会读取到默认值
- 不要直接用Activity的Context传给普通类,用
getApplicationContext()可以避免内存泄漏 - 为了安全性,建议结合Google Play Billing Library的购买凭证验证,不要只依赖SharedPreferences(毕竟用户可能手动修改本地文件绕过支付)
内容的提问来源于stack exchange,提问作者Mehran Kasebvatan
相关产品推荐
相关产品推荐

