Я новичок в разработке Android.У меня проблема с тем, что SharedPreferences
не читается в BroadcastReceiver
Справочная информация:
Я пытаюсь написать приложение для Android без графического интерфейса.приложение будет выполнять некоторую работу при каждом нажатии значка приложения, записывать настройки в общие настройки, устанавливать будильник на 3 секунды в будущем и затем завершать работу (finish ()).Значок приложения будет нажиматься 3 или 4 раза подряд.BroadcastReceiver и Shared Preferences позволят мне отслеживать, сколько раз он был нажат, когда последний раз был нажат и некоторые другие параметры.
Параметр, который я использую в манифесте для подавления GUI,
android:theme="@android:style/Theme.NoDisplay"
Есть 3 файла
- Файл манифеста
- Мой основной файл активности MyFirstTestActivity.java
- Мой класс приемника вещания 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?