Общие настройки не читаются правильно в BroadcastReceiver - PullRequest
2 голосов
/ 28 ноября 2011

Я новичок в разработке Android.У меня проблема с тем, что SharedPreferences не читается в BroadcastReceiver

Справочная информация:
Я пытаюсь написать приложение для Android без графического интерфейса.приложение будет выполнять некоторую работу при каждом нажатии значка приложения, записывать настройки в общие настройки, устанавливать будильник на 3 секунды в будущем и затем завершать работу (finish ()).Значок приложения будет нажиматься 3 или 4 раза подряд.BroadcastReceiver и Shared Preferences позволят мне отслеживать, сколько раз он был нажат, когда последний раз был нажат и некоторые другие параметры.

Параметр, который я использую в манифесте для подавления GUI,

android:theme="@android:style/Theme.NoDisplay"

Есть 3 файла

  1. Файл манифеста
  2. Мой основной файл активности MyFirstTestActivity.java
  3. Мой класс приемника вещания MyReceiver.java

Когда я нажимаю значок приложения несколько раз подряд.Класс MyFirstTestActivity правильно читает параметр «Счетчик» общих настроек и корректно увеличивает его.Он устанавливает Тревогу и передает дополнительный фрагмент данных под названием «CurrentCount» в моем Broadcast Receiver, когда я читаю Общие предпочтения, и дополнительные данные, переданные с намерением застревать на 1, не увеличиваются правильно.

То, чего я пытаюсь достичь, находится в MyReceiver.onReceive путем сравнения значения
Переданные общие настройки "Count" и дополнительная настройка Intent CurrentCount - это одно и то же значение. Я буду знать, чтопользователь перестал быстро щелкать последовательно, и тогда я могу отображать сообщение пользователю, а не отображать сообщение каждый раз, когда оно вызывается.

Ниже приведен раздел журнала Eclipse LogCat

11-288 09: 43: 10.652: I / UpdateSettings (782): чтение значения счетчика из предпочтений -7
11-28 09: 43: 10.712: I / UpdateSettings (782): чтениеОбратный отсчет от предпочтений - 8

11-28 09: 43: 10.892: W / InputManagerService (112): окно уже сфокусировано, игнорируя усиление фокуса: com.android.internal.view.IInputMethodClient $ Stub $ Proxy@ 415ef6a8
11-28 09: 43: 11.012: W / NetworkManagementSocketTagger (112): setKernelCountSet (10040, 0) завершился ошибкой с ошибкой -2
11-28 09: 43: 13.772: I / MyReceiver(797): испытание
11-28 09: 43: 13,782: I /MyReceiver (797): Предпочтения Содержит поле Count
11-28 09: 43: 13.792: I / MyReceiver (797): count = 1
11-28 09: 43: 13.792: I / MyReceiver (797): currentCount = 1

11-28 09: 43: 36.162: I / ActivityManager (112): START {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg =0x10200000 cmp = com.mywebsite.myfirsttest / .MyFirstTestActivity} из pid 212
11-28 09: 43: 36.162: W / WindowManager (112): сбой при получении снимка экрана (180x300) для слоя 21005 11-28 09:43: 36.212: W / NetworkManagementSocketTagger (112): setKernelCountSet (10040, 1) завершился ошибкой с ошибкой -2
11-28 09: 43: 36.272: I / UpdateSettings (782): считывание значения счетчика из предпочтений -8
11-28 09: 43: 36.362: I / UpdateSettings (782): чтение обратного отсчета из предпочтений - 9

11-28 09: 43: 36.583: W / InputManagerService (112): окноуже сфокусировано, игнорируя усиление фокуса: com.android.internal.view.IInputMethodClient$Stub$Proxy@41640fa8
11-28 09: 43: 36.653: W / NetworkManagementSocketTagger (112): setKernelCountSet (10040, 0) завершился ошибкой с ошибкой -2
11-28 09: 43: 39.402: I / MyReceiver (797): проверка
11-28 09: 43: 39.412: I / MyReceiver (797): Предпочтения Содержит поле Count
11-28 09: 43: 39.412: I / MyReceiver (797): count = 1
11-28 09: 43: 39.412: I / MyReceiver(797): currentCount = 1

11-28 09: 44: 27.072: D / dalvikvm (196): GC_CONCURRENT освобожден 398K, 6% свободен 10399K / 10951K, приостановлено 5 мс + 4 мс
11-2809: 47: 46.312: W / ThrottleService (112): невозможно найти статистику для iface rmnet0

Журналы с тегом UpdateSettings показывают, что обновление корректноЖурналы с тэгом MyReceiver неправильно читают последние значения общих настроек (или дополнительные данные)

Вот мои 2 исходных файла MyFirstTestActivity.java

public class MyFirstTestActivity extends Activity {

    public static final String MY_PREFS = "TestPrefs";

    /** Called when the activity is first created. */
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Note: This application has no display 
        // See the manifest @android:style/Theme.NoDisplay"

        //Toast.makeText(this,"in onCreate", Toast.LENGTH_SHORT).show();

        // Increment the count shared setting 
        int count = updateSharedPreferenceSettings();
        // Send the alarm
        setMessageAlarm(count);
        // Exit the application
        finish();

    }


    private int updateSharedPreferenceSettings() {
        SharedPreferences prefs = this.getSharedPreferences(MyFirstTestActivity.MY_PREFS, Context.MODE_WORLD_READABLE);


        int count = 1;
        if(prefs.contains("Count")) {
            count = prefs.getInt("Count", 1);
            Log.i("UpdateSettings", "Read Value of Count from Preferences -" +     String.valueOf(count));
            count = count+1;
        }

        Editor editor = prefs.edit();
        editor.putInt("Count", count);
        editor.commit();
        Log.i("UpdateSettings", "Read Back Count from Preferences - " +             prefs.getInt("Count", 0));

        return count;
    }

   private void setMessageAlarm(int currentCount) {
       Intent intent = new Intent(MyFirstTestActivity.this, MyReceiver.class);
       intent.putExtra("CurrentCount", currentCount);

       PendingIntent appIntent = 
            PendingIntent.getBroadcast(MyFirstTestActivity.this, 0, intent, 0);


       Calendar c = Calendar.getInstance();
       c.setTimeInMillis(System.currentTimeMillis());
       c.add(Calendar.SECOND, 3);

       // Set the alarm for 3 seconds in the future
       AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
       am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), appIntent); 
   }
}

Исходный файл моего приемника MyReceiver.java

    public class MyReceiver extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("MyReceiver", "Test");

        SharedPreferences prefs =     context.getSharedPreferences(MyFirstTestActivity.MY_PREFS, Context.MODE_WORLD_READABLE);
        if(prefs.contains("Count")) {
        Log.i("MyReceiver", "Preferences Contains the field Count");

        int count = prefs.getInt("Count", -2);
            Log.i("MyReceiver", "count=" + String.valueOf(count));

            int currentCount = intent.getIntExtra("CurrentCount", -3);
            Log.i("MyReceiver", "currentCount=" + String.valueOf(currentCount));    
    }
        else {
            Log.i("MyReceiver", "Preferences Does NOT Contains the field Count");
            }

}

}

Мой файл манифеста

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mywebsite.myfirsttest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name="com.mywebsite.myfirsttest.MyFirstTestActivity"
            android:theme="@android:style/Theme.NoDisplay"
             >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver  android:name="com.mywebsite.myfirsttest.MyReceiver" android:process=":remote"></receiver>
    </application>

</manifest>

Почему MyReceiver.java не берет последние SharedPreferences, а вместо этого застревает со значением при первом включении будильника? Уместно ли использовать контекст, переданный в MyReceiver?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2012

У меня была похожая проблема с этим сценарием: чтение SharedPreferences из BroadcastReceiver.

Простой ответ таков: не беспокойтесь о том, чтобы делать так много в приемнике. Вместо этого начните намеренный вызов другого Activity в той же иерархии пакетов, и вы сможете сделать это так же легко.

0 голосов
/ 04 декабря 2011

У меня есть несколько комментариев о вашем коде .....

  1. Я не вижу фильтра намерений для широковещательного получателя в манифесте или активности.

  2. Вы, вероятно, должны написать

    SharedPreferences.Editor editor = prefs.edit();
    

в updateSharedPreferenceSettings () Метод, чтобы сохранить его в SharedPreferences.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...