You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:14:51