Android广播接收器SharedPreferences在初始Activity的onResume上为空

时间:2015-06-17 00:48:37

标签: android referrer

以下是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}}时,我的应用程序将不会在第一次打开时返回MainActivityreferrer是否有理由不在第一个应用程序打开时存储我的SharedPreferences?我想在第一次打开时传回referrer而不是第二次打开。

3 个答案:

答案 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)

resume()上的

将在广播接收器之前执行,因此第一次你可能会收到引用者的空值或默认值,如果你重新打开活动,你可能会获得正确的值,因为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项目。