更改 BroadcastReceiver 中的变量

Change Variable in BroadcastReceiver

我想更改 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 Class:

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 class 中 MyAlarm class 的变量 RecordTimeMinutes。这可能吗?

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

这样您就可以从 Activity 和接收器访问它而不会出现任何问题。

可能无法直接访问 activity 中的变量,除非您将其设为静态,这是您不应该做的事情!

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

就是说 - 您应该 发布处理程序以在 BroadcastReceiver 中触发。无法保证您的进程从现在起 1 分钟后仍会运行以执行您的代码。相反,您可以安排另一个警报或使用 WorkManager 将作业安排到 运行 以后。

希望对您有所帮助!