簡體   English   中英

Android:在廣播接收器中使用sharedPreferences

[英]Android: using sharedPreferences in a broadcast receiver

我正在嘗試創建一個應用程序,如果手機收到包含存儲在默認首選項中的字符串的SMS,將觸發Toast消息。 我的問題是,收到短信后我無法出現祝酒詞。 我已經使用聲明的字符串測試了接收器的代碼並且它可以工作,但是當我使用存儲的優先級時,它不會出現。 這是我的示例代碼:

public class Main extends Activity{
private static final int RESULT_SETTINGS = 1;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    display();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_settings:
            Intent i = new Intent(this, Settings.class);
            startActivityForResult(i, RESULT_SETTINGS);
            break;
    }
    return true;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case RESULT_SETTINGS: display(); break;
    }
}

private void display(){
    TextView displayv = (TextView) findViewById(R.id.mysettings);
    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    // codes that display
}

這是接收器

public class WakeSMS extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent){
    SharedPreferences sharedPrefs = context.getSharedPreferences("sharedPrefs", context.MODE_PRIVATE);
    String trigger=sharedPrefs.getString("smsstr","NULL");

    Bundle bundle = intent.getExtras();
    SmsMessage[] msgs = null;
    String str= "SMS from";
    if(bundle != null){
        Object[] pdus =(Object[])bundle.get("pdus");
        msgs=new SmsMessage[pdus.length];
        for (int i = 0; i<msgs.length; i++){
            msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            if(i==0){
                str+= msgs[i].getOriginatingAddress();
                str+=": ";
            }
            str+=msgs[i].getMessageBody().toString();
        }
        if(str.contains(trigger)){
            Toast.makeText(context, str, Toast.LENGTH_LONG).show();
        }
    }
}}

在我的主要活動中,我可以讓我的代碼顯示prefs但在接收器中它無法觸發toast。 有什么我做錯了嗎? (我的接收器被稱為WakeSMS,因為它應該在將來觸發警報,但是現在我只是想讓它觸發測試的祝酒)

編輯:我有一種感覺,我在我的代碼中聲明我的偏好的方式可能是關閉的,但是由於首選項的值可以顯示在主要部分,因此我無法弄清楚我做錯了什么活動,但不能在接收器中使用。

getDefaultSharedPreferences()返回一個SharedPreferences文件,其名稱基於應用程序包。 就像在說

context.getSharedPreferences("com.your.package_preferences", context.MODE_PRIVATE);

然后在你的接收器中說

context.getSharedPreferences("sharedPrefs", context.MODE_PRIVATE);

它使用不同的名稱獲取共享首選項。

因此,您將保存到一個SharedPreference文件,但嘗試從另一個文件檢索。

嘗試使用

getSharedPreferences("MySmsSharedPrefs", context.MODE_PRIVATE);

在保存和恢復中。 即在Acvtivity和Receiver中


這是確認的醬: https//android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/preference/PreferenceManager.java

**
 * Gets a SharedPreferences instance that points to the default file that is
 * used by the preference framework in the given context.
 * 
 * @param context The context of the preferences whose values are wanted.
 * @return A SharedPreferences instance that can be used to retrieve and
 *         listen to values of the preferences.
 */
public static SharedPreferences getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
            getDefaultSharedPreferencesMode());
}

private static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM