Изменить переменную в BroadcastReceiver - PullRequest
0 голосов
/ 11 ноября 2019

Я хочу изменить переменную BroadcastReceiver. К сожалению, приложение зависало каждый раз, когда я пытаюсь получить к нему доступ.

Вот пример:

public class MainActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.buttonAlarm).setOnClickListener(new View.OnClickListener() {
            setAlarm();
        });
    }

    public void setAlarm(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(datePicker.getYear(),datePicker.getMonth(),datePicker.getDayOfMonth(),timePicker.getCurrentHour(),timePicker.getCurrentMinute(), 0);
        am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(this, MyAlarm.class);
        pi = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
        am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), Interval*60000, pi);
    }
}

Это класс MyAlarm.java, который расширяет BroadcastReceiver:

public class MyAlarm extends BroadcastReceiver {
    int RecordTimeMinutes;

    public void onReceive(final Context context, Intent intent) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run(){
                //do some stuff
            }
        }, RecordTimeMinutes * 60000);
    }
}

Итак, в основном я хочу получить доступ к переменной RecordTimeMinutes класса MyAlarm в классе MainActivity. Это возможно?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Для вашего случая использования, почему бы вам не сохранить значение RecordTimeMinutes в ключе с общими предпочтениями?

Таким образом, вы сможете получить к нему доступ как из Действия, так и из Получателя без каких-либопроблемы.

Прямой доступ к переменной в упражнении может быть невозможен, если вы не сделаете его статическим, что вы не должны делать!

1 голос
/ 11 ноября 2019

Передайте переменную из Activity через дополнительные функции Intent:

public void setAlarm(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(datePicker.getYear(),datePicker.getMonth(),datePicker.getDayOfMonth(),timePicker.getCurrentHour(),timePicker.getCurrentMinute(), 0);
        am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(this, MyAlarm.class);

        i.putInt("Interval", 42); // Pass "interval" value here

        pi = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
        am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), Interval*60000, pi);
}

И затем в получателе:

public class MyAlarm extends BroadcastReceiver {
    public void onReceive(final Context context, Intent intent) {

        int interval = intent.getIntExtra("Interval", 0) // Get "interval" value here

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run(){
                //do some stuff
            }
        }, interval * 60000); // Use "interval" here
    }
}

При этом вы должны не размещать обработчик для запуска в будущем внутри BroadcastReceiver. Нет никакой гарантии, что ваш процесс все еще будет активен через 1 минуту для выполнения вашего кода. Вместо этого вы можете запланировать другой сигнал тревоги или использовать WorkManager, чтобы запланировать выполнение задания позже.

Надеюсь, это поможет!

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