Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
JavJun
12 / 10 / 3
Регистрация: 27.08.2015
Сообщений: 236
#1

Чтение preferences в BroadcastReceiver - Программирование Android

13.02.2017, 01:17. Просмотров 214. Ответов 5
Метки нет (Все метки)

Доброго времени суток.
Сам смысл того что я делаю: есть активити, которая отображает состояние батареи, есть активити настроек и есть сервис, который мониторит состояние батареи. В сервисе есть проверка настроек на включение сигнала при определенном уровне заряда, но не смотря на изменение настроек, в сервисе они не меняются. Меняются, только если полностью убить сервис и потом запустить снова.
Буду очень благодарен любой помощи или подсказке.

Код сокращен на сколько мог, что бы сэкономить ваше время, но и передать суть проблемы.

MainActivity.java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        tv_temperature = (TextView) findViewById(R.id.temperature);
 
        notification.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent prefActiv = new Intent(MainActivity.this,PrefActivity.class);
                startActivity(prefActiv);
            }
 
        });
 
        registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        Intent intentService = new Intent(this,NotificationService.class);
        startService(intentService);
    }
 
 
    private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context c, Intent intent) {
            int temperature = intent.getIntExtra("temperature", 0);
 
            tv_temperature.setText("Temp: " + String.valueOf(tempC)
                    + "°C / "+String.valueOf(tempF)+ "°F");
 
        }
    };


AlarmPreference.java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class AlarmPreference {
    private SharedPreferences prefs;
 
    AlarmPreference(Context context){
        prefs = context.getSharedPreferences("Alarm",Context.MODE_PRIVATE);
    }
 
    void setNotif(String value,Boolean choice){
        prefs.edit().putBoolean(value, choice).apply();
    }
 
    Boolean getNotif(String value){
        return prefs.getBoolean(value,false);
    }
 
}


BootReceiver.java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
public class BootReceiver extends BroadcastReceiver {
 
    @Override
    public void onReceive(Context context, Intent intent) {
            Intent serviceIntent = new Intent(context, NotificationService.class);
            context.startService(serviceIntent);
    }
 
}


NotificationService.java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class MainActivity extends AppCompatActivity implements Constants {
 
 
  @Override
    public void onCreate() {
        super.onCreate();
        alarmPreference = new AlarmPreference(this);
        this.registerReceiver(this.mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    }
 
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
 
    BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
 
 
            if (isDischarging) {
 
                if(alarmPreference.getNotif(ALARM)) {
                    alarm = true;
                }
 
                Toast.makeText(getApplicationContext(), // проверяю, что не смотря на изменение настроек, тут они не меняются 
                        "ALARM: "+String.valueOf(alarmPreference.getNotif(ALARM)),Toast.LENGTH_SHORT).show();
 
            }
 
        }
 
    };
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2017, 01:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Чтение preferences в BroadcastReceiver (Программирование Android):

Preferences - Программирование Android
Доброго всем дня. В android только начинаю разбираться. Пытаюсь сохранить настройки по уроку...

Preferences - Программирование Android
Как проверить были ли хотя бы раз хранены данные с помощью Preferences

Preferences из Applicaton - Программирование Android
Нужно еще до открытия формы (в Application) получать и сохранять настройки. Пока работаю с текстовиком. Теоретически могу...

BroadcastReceiver - Программирование Android
У меня такой вопрос если я создал ресивер и прописал его в манифесте. Мой ресивер прослушивает определенные интенты. И у меня такой вопрос...

Preferences Framework: ActionBar - Программирование Android
Всем привет! Недавно начал изучать Android. При написании программы я пользовался Preferences Framework. Но Preferences Framework не...

Ошибка в Preferences Framework - Программирование Android
Недавно начал изучать программирование под андроид и столкнулся с проблемой. Я создал xml с настройками через Preferences Framework, создал...

5
ExFau$t
490 / 447 / 91
Регистрация: 08.05.2012
Сообщений: 2,244
13.02.2017, 08:54 #2
Зачем тебе класс для изменения настроек? Сервисов никаких я так и не увидел.
Цитата Сообщение от JavJun Посмотреть сообщение
не смотря на изменение настроек
Я не вижу здесь кода, меняющего настройки. С бродкастом что-то вообще непонятное мутишь.
0
JavJun
12 / 10 / 3
Регистрация: 27.08.2015
Сообщений: 236
13.02.2017, 12:43  [ТС] #3
ExFau$t, я просто не публиковал код активности, где меняются настройки (код тоже сократил):

PrefActivity.java

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class PrefActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener, Constants{
 
    CheckBox setAlarm;
    ImageButton setDone;
    AlarmPreference alarmPreference;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pref);
 
        setAlarm = (CheckBox) findViewById(R.id.alarmBox);
      
        setDone = (ImageButton) findViewById(R.id.done);
 
        alarmPreference = new AlarmPreference(this);
 
        checkChecked();
 
        setAlarm.setOnCheckedChangeListener(this);
 
        setDone.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent prefActiv = new Intent(PrefActivity.this,MainActivity.class);
                startActivity(prefActiv);
                PrefActivity.this.finish();
            }
 
        });
 
    }
 
    private void checkChecked() {
        if(alarmPreference.getNotif(ALARM)) {
            setAlarm.setChecked(true);
        }
       
    }
 
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        switch(buttonView.getId()){
            case R.id.alarmBox:
                if(setAlarm.isChecked()) {
                    alarmPreference.setNotif(ALARM,true);
                }else{
                    alarmPreference.setNotif(ALARM,false);
                }
                break;
        }
 
    }
   
}


AndroidManifest.xml
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<activity
            android:name=".MainActivity"
            android:launchMode="singleInstance"
            android:screenOrientation="portrait"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".PrefActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar">
        </activity>
 
 
        <service
            android:name=".NotificationService"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
            android:process=":BatMonitoring">
        </service>
 
        <receiver
            android:name=".BootReceiver"
            android:label="@string/app_name"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
            android:enabled="true">
 
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                <action android:name="android.intent.action.REBOOT"/>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
 
        </receiver>


В общем, когда я перехожу в PrefAvticity и ставлю галочку, то alarmPreference.setNotif(ALARM,true); срабатывает и настройки меняются. Но когда проверяю alarmPreference.getNotif(ALARM) в NotificationService, то они не меняются. Вот в этом и проблема.
0
ExFau$t
490 / 447 / 91
Регистрация: 08.05.2012
Сообщений: 2,244
13.02.2017, 12:53 #4
Я всё равно ничего не понимаю, ну например, во твой код, ты подписал как NotificationService.java:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class MainActivity extends AppCompatActivity implements Constants {
 
 
  @Override
    public void onCreate() {
        super.onCreate();
        alarmPreference = new AlarmPreference(this);
        this.registerReceiver(this.mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    }
 
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
 
    BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
 
 
            if (isDischarging) {
 
                if(alarmPreference.getNotif(ALARM)) {
                    alarm = true;
                }
 
                Toast.makeText(getApplicationContext(), // проверяю, что не смотря на изменение настроек, тут они не меняются 
                        "ALARM: "+String.valueOf(alarmPreference.getNotif(ALARM)),Toast.LENGTH_SHORT).show();
 
            }
 
        }
 
    };
Вот и объясни мне, пожалуйста, это:
Java
1
class MainActivity extends AppCompatActivity
и ещё почему бродкаст болтается где-то между методами, а не перед registerReceiver.
0
JavJun
12 / 10 / 3
Регистрация: 27.08.2015
Сообщений: 236
13.02.2017, 13:45  [ТС] #5
ExFau$t, это моя ошибка. Там
Java
1
public class NotificationService extends Service implements Constants {
И второе: может я не уловил всех тонкостей, но вы имеете в виду, что нужно прописать бродкаст в onCreate?
0
ExFau$t
490 / 447 / 91
Регистрация: 08.05.2012
Сообщений: 2,244
13.02.2017, 16:42 #6
Зачем тебе вообще бродкаст вызывать из сервиса? Проверь условие своё после этой строчки:
Java
1
alarmPreference = new AlarmPreference(this);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2017, 16:42
Привет! Вот еще темы с ответами:

Preferences работает не корректно - Программирование Android
изучаю андроид по учебнику Рето Майера. Дошел до темы создания меню настроек. делаю все по примеру но почему то программа работает не...

Ошибка в Preferences в Android 4.4 - Программирование Android
Здравствуйте! Не могу понять суть ошибки, на всех версиях Android 2.2+ программа выполнялась корректно, до выхода Kit kat... У меня в...

BroadcastReceiver и startActivity - Программирование Android
У меня есть служба и BroadcastReceiver. Когда приходит событие, то я вызываю startService. Если служба не запущена, то она запускается и...

Уведомления в BroadcastReceiver - Программирование Android
Привет, уважаемые! Прикрутил BroadcastReceiver, мониторю входящие смс, пытаюсь отключить звук входящего смс если оно удовлетворяет моим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru