无法从我的警报管理器的广播接收器修改 Activity
Not Able to modify an Activity from my Broadcast Receiver of Alarm Manager
我想修改我的计划,它是每天午夜的应用程序数据库。我还想修改我的 Activity,它显示某些数字,这些数字应该根据计划信息每天更改。我可以使用警报管理器更新数据库,但无法更改 Activity 的文本视图。它给我这个错误:
java.lang.ClassCastException: android.app.ReceiverRestrictedContext cannot be cast to com.example.bleh.myapplication.feature2
这是我的警报接收器Class:
package com.example.bleh.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.example.bleh.myapplication.DB.AppDatabase;
import com.example.bleh.myapplication.DB.Plan;
import com.example.bleh.myapplication.DB.User;
import com.example.bleh.myapplication.Utils1.FormulaUtils;
import com.github.lzyzsd.circleprogress.DonutProgress;
public class AlarmReceiver extends BroadcastReceiver {
private static final String DEBUG_TAG = "AlarmReceiver";
public AppDatabase mydb;
Plan plan;
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();
mydb = AppDatabase.getInstance(context);
final long planid = intent.getExtras().getLong("planid");
final long userid = intent.getExtras().getLong("uid");
final String requirements = intent.getExtras().getString("requirements");
Log.wtf("PlanId: ",planid+"");
Log.wtf("UserId: ",userid+"");
Log.wtf("Requirements",requirements);
plan = mydb.getPlanDao(context).getPlanById((int) planid);
final User user = mydb.getUserDao(context).getUserById((int) userid);
plan.setCurrentWeight(FormulaUtils.reCalculateWeight(plan.getCurrentWeight(), Double.parseDouble(requirements)));
plan.setBmr(Double.parseDouble(FormulaUtils.calculateBmr(user.getSex(), plan.getCurrentWeight(), user.getHeight(), user.getBirthDay())));
plan.setNbOfDays(plan.getNbOfDays() - 1);
mydb.getPlanDao(context).update(plan);
TextView requirement = ((feature2)context).findViewById(R.id.requirements);
TextView Days = ((feature2)context).findViewById(R.id.days);
DonutProgress DailyProgress = ((feature2)context).findViewById(R.id.donut_progress);
requirement.setText(FormulaUtils.CalulcateDailyRequirements(plan.getWorkoutPerWeek(), plan.getBmr()));
Days.setText(plan.getNbOfDays()+"");
int progress = 0;
DailyProgress.setProgress((float) progress);
// Intent newIntent = new Intent(context, feature2.class);
// newIntent.putExtra("uid", userid);
// newIntent.putExtra("planid", planid);
// context.startActivity(newIntent);
}
}
这是我的特征Activity(部分):
public class feature2 extends AppCompatActivity {
public AppDatabase mydb;
TextView BMR,requirements,days;
Button addfood,addex,nextday;
LinearLayout mainLayout;
Button Meas,Bluetooth;
DonutProgress donutProgress;
Plan plan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_feature2);
Intent intent = getIntent();
requirements = findViewById(R.id.requirements);
donutProgress = findViewById(R.id.donut_progress);
days = findViewById(R.id.days);
final long planid = intent.getExtras().getLong("planid");
final long userid = intent.getExtras().getLong("uid");
mydb = AppDatabase.getInstance(feature2.this);
plan = mydb.getPlanDao(feature2.this).getPlanById((int) planid);
requirements.setText(FormulaUtils.CalulcateDailyRequirements(plan.getWorkoutPerWeek(), plan.getBmr()));
Intent intent1 = new Intent(this, AlarmReceiver.class);
intent1.putExtra("uid", userid);
intent1.putExtra("planid", planid);
intent1.putExtra("requirements",requirements.getText().toString());
Calendar updateTime = Calendar.getInstance();
updateTime.setTimeZone(TimeZone.getTimeZone("GMT"));
updateTime.set(Calendar.HOUR_OF_DAY, 20);
updateTime.set(Calendar.MINUTE, 03);
updateTime.set(Calendar.SECOND,0);
Date milliseconds = updateTime.getTime();
Log.wtf("millisec",milliseconds+"");
long millis = milliseconds.getTime();
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
intent1, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, millis , pendingIntent);
Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();
}
}
这一行会让你的应用崩溃
TextView requirement = ((feature2)context).findViewById(R.id.requirements);
context
是 ReceiverRestrictedContext
的实例,feature2
是 AppCompatActivity
的实例,其父项是 ContextThemeWrapper
。 feature2
不是 ReceiverRestrictedContext
的实例,这就是为什么您的应用会抛出 ClassCastException
并导致您的应用崩溃。
解决方法:有很多方法可以解决你的问题,这里介绍一个简单的方法。
第 1 步: 在 AlarmReceiver
class 中,从 FLAG_ACTIVITY_SINGLE_TOP | FLAG_ACTIVITY_CLEAR_TOP
开始 feature2
activity。
public class AlarmReceiver extends BroadcastReceiver {
private static final String DEBUG_TAG = "AlarmReceiver";
public AppDatabase mydb;
Plan plan;
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();
mydb = AppDatabase.getInstance(context);
final long planid = intent.getExtras().getLong("planid");
final long userid = intent.getExtras().getLong("uid");
final String requirements = intent.getExtras().getString("requirements");
Log.wtf("PlanId: ",planid+"");
Log.wtf("UserId: ",userid+"");
Log.wtf("Requirements",requirements);
plan = mydb.getPlanDao(context).getPlanById((int) planid);
final User user = mydb.getUserDao(context).getUserById((int) userid);
plan.setCurrentWeight(FormulaUtils.reCalculateWeight(plan.getCurrentWeight(), Double.parseDouble(requirements)));
plan.setBmr(Double.parseDouble(FormulaUtils.calculateBmr(user.getSex(), plan.getCurrentWeight(), user.getHeight(), user.getBirthDay())));
plan.setNbOfDays(plan.getNbOfDays() - 1);
mydb.getPlanDao(context).update(plan);
// Calculate all data before sending to feature2 activity
String requirement = FormulaUtils.CalulcateDailyRequirements(plan.getWorkoutPerWeek(), plan.getBmr());
String day = plan.getNbOfDays() + "";
float progress = 0F;
// Start feature2 activity with updated data
Intent updateFeature2Intent = new Intent(context, feature2.class);
updateFeature2Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); // Add this flag
newIntent.putExtra("requirement", requirement);
newIntent.putExtra("day", day);
newIntent.putExtra("progress", progress);
context.startActivity(newIntent);
}
}
第 2 步: 如果 feature2
activity 在后台并且对用户可见,onNewIntent
将被调用,在这种情况下得到数据并在那里更新您的 UI。
public class feature2 extends AppCompatActivity {
...
// Add this method
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// Get data from intent
String requirement = intent.getStringExtra("requirement");
String day = intent.getStringExtra("day");
float progress = intent.getFloatExtra("progress", 0F);
// Update UI
TextView requirements = findViewById(R.id.requirements);
TextView Days = findViewById(R.id.days);
DonutProgress dailyProgress = findViewById(R.id.donut_progress);
requirements.setText(requirement);
Days.setText(day);
dailyProgress.setProgress(progress);
}
}
我想修改我的计划,它是每天午夜的应用程序数据库。我还想修改我的 Activity,它显示某些数字,这些数字应该根据计划信息每天更改。我可以使用警报管理器更新数据库,但无法更改 Activity 的文本视图。它给我这个错误:
java.lang.ClassCastException: android.app.ReceiverRestrictedContext cannot be cast to com.example.bleh.myapplication.feature2
这是我的警报接收器Class:
package com.example.bleh.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.example.bleh.myapplication.DB.AppDatabase;
import com.example.bleh.myapplication.DB.Plan;
import com.example.bleh.myapplication.DB.User;
import com.example.bleh.myapplication.Utils1.FormulaUtils;
import com.github.lzyzsd.circleprogress.DonutProgress;
public class AlarmReceiver extends BroadcastReceiver {
private static final String DEBUG_TAG = "AlarmReceiver";
public AppDatabase mydb;
Plan plan;
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();
mydb = AppDatabase.getInstance(context);
final long planid = intent.getExtras().getLong("planid");
final long userid = intent.getExtras().getLong("uid");
final String requirements = intent.getExtras().getString("requirements");
Log.wtf("PlanId: ",planid+"");
Log.wtf("UserId: ",userid+"");
Log.wtf("Requirements",requirements);
plan = mydb.getPlanDao(context).getPlanById((int) planid);
final User user = mydb.getUserDao(context).getUserById((int) userid);
plan.setCurrentWeight(FormulaUtils.reCalculateWeight(plan.getCurrentWeight(), Double.parseDouble(requirements)));
plan.setBmr(Double.parseDouble(FormulaUtils.calculateBmr(user.getSex(), plan.getCurrentWeight(), user.getHeight(), user.getBirthDay())));
plan.setNbOfDays(plan.getNbOfDays() - 1);
mydb.getPlanDao(context).update(plan);
TextView requirement = ((feature2)context).findViewById(R.id.requirements);
TextView Days = ((feature2)context).findViewById(R.id.days);
DonutProgress DailyProgress = ((feature2)context).findViewById(R.id.donut_progress);
requirement.setText(FormulaUtils.CalulcateDailyRequirements(plan.getWorkoutPerWeek(), plan.getBmr()));
Days.setText(plan.getNbOfDays()+"");
int progress = 0;
DailyProgress.setProgress((float) progress);
// Intent newIntent = new Intent(context, feature2.class);
// newIntent.putExtra("uid", userid);
// newIntent.putExtra("planid", planid);
// context.startActivity(newIntent);
}
}
这是我的特征Activity(部分):
public class feature2 extends AppCompatActivity {
public AppDatabase mydb;
TextView BMR,requirements,days;
Button addfood,addex,nextday;
LinearLayout mainLayout;
Button Meas,Bluetooth;
DonutProgress donutProgress;
Plan plan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_feature2);
Intent intent = getIntent();
requirements = findViewById(R.id.requirements);
donutProgress = findViewById(R.id.donut_progress);
days = findViewById(R.id.days);
final long planid = intent.getExtras().getLong("planid");
final long userid = intent.getExtras().getLong("uid");
mydb = AppDatabase.getInstance(feature2.this);
plan = mydb.getPlanDao(feature2.this).getPlanById((int) planid);
requirements.setText(FormulaUtils.CalulcateDailyRequirements(plan.getWorkoutPerWeek(), plan.getBmr()));
Intent intent1 = new Intent(this, AlarmReceiver.class);
intent1.putExtra("uid", userid);
intent1.putExtra("planid", planid);
intent1.putExtra("requirements",requirements.getText().toString());
Calendar updateTime = Calendar.getInstance();
updateTime.setTimeZone(TimeZone.getTimeZone("GMT"));
updateTime.set(Calendar.HOUR_OF_DAY, 20);
updateTime.set(Calendar.MINUTE, 03);
updateTime.set(Calendar.SECOND,0);
Date milliseconds = updateTime.getTime();
Log.wtf("millisec",milliseconds+"");
long millis = milliseconds.getTime();
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
intent1, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, millis , pendingIntent);
Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();
}
}
这一行会让你的应用崩溃
TextView requirement = ((feature2)context).findViewById(R.id.requirements);
context
是 ReceiverRestrictedContext
的实例,feature2
是 AppCompatActivity
的实例,其父项是 ContextThemeWrapper
。 feature2
不是 ReceiverRestrictedContext
的实例,这就是为什么您的应用会抛出 ClassCastException
并导致您的应用崩溃。
解决方法:有很多方法可以解决你的问题,这里介绍一个简单的方法。
第 1 步: 在 AlarmReceiver
class 中,从 FLAG_ACTIVITY_SINGLE_TOP | FLAG_ACTIVITY_CLEAR_TOP
开始 feature2
activity。
public class AlarmReceiver extends BroadcastReceiver {
private static final String DEBUG_TAG = "AlarmReceiver";
public AppDatabase mydb;
Plan plan;
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();
mydb = AppDatabase.getInstance(context);
final long planid = intent.getExtras().getLong("planid");
final long userid = intent.getExtras().getLong("uid");
final String requirements = intent.getExtras().getString("requirements");
Log.wtf("PlanId: ",planid+"");
Log.wtf("UserId: ",userid+"");
Log.wtf("Requirements",requirements);
plan = mydb.getPlanDao(context).getPlanById((int) planid);
final User user = mydb.getUserDao(context).getUserById((int) userid);
plan.setCurrentWeight(FormulaUtils.reCalculateWeight(plan.getCurrentWeight(), Double.parseDouble(requirements)));
plan.setBmr(Double.parseDouble(FormulaUtils.calculateBmr(user.getSex(), plan.getCurrentWeight(), user.getHeight(), user.getBirthDay())));
plan.setNbOfDays(plan.getNbOfDays() - 1);
mydb.getPlanDao(context).update(plan);
// Calculate all data before sending to feature2 activity
String requirement = FormulaUtils.CalulcateDailyRequirements(plan.getWorkoutPerWeek(), plan.getBmr());
String day = plan.getNbOfDays() + "";
float progress = 0F;
// Start feature2 activity with updated data
Intent updateFeature2Intent = new Intent(context, feature2.class);
updateFeature2Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); // Add this flag
newIntent.putExtra("requirement", requirement);
newIntent.putExtra("day", day);
newIntent.putExtra("progress", progress);
context.startActivity(newIntent);
}
}
第 2 步: 如果 feature2
activity 在后台并且对用户可见,onNewIntent
将被调用,在这种情况下得到数据并在那里更新您的 UI。
public class feature2 extends AppCompatActivity {
...
// Add this method
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// Get data from intent
String requirement = intent.getStringExtra("requirement");
String day = intent.getStringExtra("day");
float progress = intent.getFloatExtra("progress", 0F);
// Update UI
TextView requirements = findViewById(R.id.requirements);
TextView Days = findViewById(R.id.days);
DonutProgress dailyProgress = findViewById(R.id.donut_progress);
requirements.setText(requirement);
Days.setText(day);
dailyProgress.setProgress(progress);
}
}