BroadcastReceiver中的更改变量

问题描述 投票:0回答:2

我想更改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);
    }
}

这是扩展BroadcastReceiver的MyAlarm.java类:

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);
    }
}

因此,基本上我想在MainActivity类中访问MyAlarm类的Variable RecordTimeMinutes。有可能吗?

java android android-studio
2个回答
1
投票

对于您的用例,为什么不将RecordTimeMinutes的值保存到共享首选项键中?

这样,您将可以从活动和接收方都没有任何问题地访问它。

除非您将其设置为静态,否则不可能直接在活动中访问变量,这是您不应要做的事情!


0
投票

通过Intent Extras从Activity传递变量:

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
    }
}

话虽如此-您应该not在将来在BroadcastReceiver中发布要触发的处理程序。无法保证您的过程从现在起1分钟后仍然可以执行代码。相反,您可以安排另一个警报或使用WorkManager安排作业以稍后运行。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.