更改 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 将作业安排到 运行 以后。
希望对您有所帮助!
我想更改 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 将作业安排到 运行 以后。
希望对您有所帮助!