Android开发:PendingIntent缺失FLAG_MUTABLE/IMMUTABLE错误排查
问题描述
我正在开发一款Android Java应用,需要每天午夜自动执行一系列代码逻辑。这是之前问题的后续开发,我按照@Muzammal_Ghafoor的回答重构了代码,但遇到了报错:创建PendingIntent时必须指定FLAG_MUTABLE或FLAG_IMMUTABLE。我没看懂官方文档里关于这两个标记的说明,不知道该怎么修改代码解决这个问题。
相关代码片段
MainActivity.java // onCreate() 方法
public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_main); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); scheduleDailyTask(this); }
MainActivity.java // scheduleDailyTask() 方法
public void scheduleDailyTask(Context context){ AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, DailyTaskBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE | PendingIntent.FLAG_IMMUTABLE); // Alarm Schedule if (pendingIntent == null) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.add(Calendar.DAY_OF_YEAR, 1); // 1 = next day // Set the alarm to trigger at midnight every day alarmManager.setRepeating( AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) ); } }
DailyTaskBroadcastReceiver.java
public class DailyTaskBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { storage.createNewDailyCSV(context); } }
storage.java // createNewDailyCSV() 方法
public static void createNewDailyCSV(Context context){ try { // 创建文件所需的目录 ContextWrapper contextWrapper = new ContextWrapper(context); Date dayToday = Calendar.getInstance().getTime(); String year = DayData.formatYEAR(dayToday); String month = DayData.formatMONTH(dayToday); dailyFileName = DayData.formatDAY(dayToday); dailyFilePath = new File(contextWrapper.getExternalFilesDir(year + "/" + month), dailyFileName); // 创建CSV文件并写入所需信息 loadConstCSV(); PrintWriter outputFile = new PrintWriter(dailyFilePath); StringBuilder sb = new StringBuilder(); String name; String price; String weekday = DayData.formatWEEKDAY(dayToday); boolean[] weekdayBOOL; for (int i=0; i<Data.constantList.size();i++){ name = Data.constantList.get(i).getName(); price = String.valueOf(Data.constantList.get(i).getPrice()); weekdayBOOL = Data.constantList.get(i).getWd_Bool(); switch (weekday){ case "Sun": if (weekdayBOOL[0]){ sb.append(name).append(",").append(price).append("\n"); } break; case "Mon": if (weekdayBOOL[1]){ sb.append(name).append(",").append(price).append("\n"); } break; case "Tue": if (weekdayBOOL[2]){ sb.append(name).append(",").append(price).append("\n"); } break; case "Wed": if (weekdayBOOL[3]){ sb.append(name).append(",").append(price).append("\n"); } break; case "Thu": if (weekdayBOOL[4]){ sb.append(name).append(",").append(price).append("\n"); } break; case "Fri": if (weekdayBOOL[5]){ sb.append(name).append(",").append(price).append("\n"); } break; case "Sat": if (weekdayBOOL[6]){ sb.append(name).append(",").append(price).append("\n"); } break; } outputFile.write(sb.toString()); outputFile.close(); } }catch (Exception e){ e.printStackTrace(); }finally { Data.constantList.clear(); } } }
内容的提问来源于stack exchange,提问作者Akira
相关产品推荐
相关产品推荐

