以下是onResume
中的MainActivity
来电:
@Override
public void onResume() {
super.onResume();
SharedPreferences settings = context.getSharedPreferences(INSTALL_PREFERENCE, 0);
String referrerString = settings.getString(REFERRAL_KEY, null);
Map<String, String> params = new HashMap<~>();
if (referrerString != null){
params.put("referrer", referrerString);
}
}
以下是我在onResume
范围内扩展BroadcastReceiver
的{{1}}:
@Override
public void onReceive(Context context, Intent intent){
try{
String referrerString = intent.getStringExtra("referrer");
if(null != referrerString){
String referrer = URLEncoder.encode(referrerString, "UTF-8");
context.getSharedPreferences(INSTALL_PREFERENCE, Context.MODE_PRIVATE).edit().putString(REFERRAL_KEY, referrer).commit();
}
}
catch (Exception e){
//don't handle exceptions for now
}
}
问题在于,当我通过打开应用程序调用{{1}}时,我的应用程序将不会在第一次打开时返回MainActivity
。 referrer
是否有理由不在第一个应用程序打开时存储我的SharedPreferences
?我想在第一次打开时传回referrer
而不是第二次打开。
答案 0 :(得分:1)
以下是解决问题的方法之一。让您的Activity实现OnSharedPreferenceChangeListener接口,当注册的SharedPreference文件中的任何值发生更改时,该接口将调用<div class="header" id="banner">
<div style="width:25%; border:1px solid #FFD700">
<img src="http://i.imgur.com/OrPKrUc.png" id="banner_logo" /> <!-- The LMUN Logo -->
</div>
<div style="width: 50%; border: 1px solid #ff0000">
<img src="http://i.imgur.com/NJJKSXh.png" id="banner_txtcombo" /> <!-- The LMUN text image -->
</div>
<div style="width: 25%; border: 1px solid #000">
<img src="http://i.imgur.com/OrPKrUc.png" id="banner_logo" /> <!-- The LMUN Logo -->
</div>
</div>
回调。
如果时机合适,并且您获得了onSharedPreferenceChanged()
中的值,请按照当前代码中的方式继续。
如果您还没有值,则显示ProgressDialog,然后等待BroadcastReceiver填充该值。
一旦BroadcastReceiver修改了该值,请捕获onResume()
中的值,然后根据需要使用它。
以下是解决方案的一般结构:
onSharedPreferenceChanged()
答案 1 :(得分:0)
将在广播接收器之前执行,因此第一次你可能会收到引用者的空值或默认值,如果你重新打开活动,你可能会获得正确的值,因为onReceive ()此时会执行。
如果您的应用程序具有任何设置首选项屏幕,该屏幕仅在打开后才会初始化设置,因此您可能必须在使用之前使用默认值初始化所有首选项。这可能是因为有时如果您打开应用程序,您可能会获得正确的值,因为您可能已经打开了设置屏幕。
答案 2 :(得分:0)
在您的应用的主要组件启动后稍微发送引荐来源广播。因此,您必须在收到广播后通知您的活动 一个简单的解决方案是在Receiver和Activity之间使用LocalBroadcastManager:
/* BroadcastReceiver */
@Override
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
String referrer = (String) extras.get(KEY_REFERRER);
// save String to SharedPrefrences
Intent intent = new Intent(ACTION_UPDATE);
intent.putExtra(KEY_REFERRER, referrer);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
/*****/
/* Activity*/
private final BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String referrer = intent.getStringExtra(KEY_REFERRER);
}
};
@Override
protected void onPause() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(mUpdateReceiver);
super.onPause();
}
@Override
protected void onResume() {
LocalBroadcastManager.getInstance(this).registerReceiver(mUpdateReceiver, new IntentFilter(ReferrerReceiver.ACTION_UPDATE));
super.onResume();
}
如果您需要完全功能性的示例代码/应用程序,请查看GitHub上的OpenSource项目。