当前位置: 首页 > 知识库问答 >
问题:

Android:设置手机重启后的闹钟/提醒

何涵忍
2023-03-14

我正在开发一个集成了提醒功能的Android应用程序。如果手机一直开着,通知就会起作用,但当我关机或重启时,我就失去了所有的警报。我知道这是和Android的功能来提高手机的效率,但我不知道该怎么办,我该怎么解决这个问题呢?

这里是我的文件:

>

  • AlarmService.java

    下面是代码:

    AlarmService.java

    public class AlarmService extends IntentService {
        public AlarmService() {
            super("AlarmService");
        }
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Calendar calendar = Calendar.getInstance();
        FileInputStream fileInputStream = null;
        int requestCode, year, month, day, hour, minute;
        String note, with;
    
        try {
            fileInputStream = openFileInput("my_alarms.csv");
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String row;
    
            while ((row = bufferedReader.readLine()) != null) {
                String[] splittedRow = row.split(";");
                requestCode = Integer.valueOf(splittedRow[0]);
                year = Integer.valueOf(splittedRow[1]);
                month = Integer.valueOf(splittedRow[2]);
                day = Integer.valueOf(splittedRow[3]);
                hour = Integer.valueOf(splittedRow[4]);
                minute = Integer.valueOf(splittedRow[5]);
                note = splittedRow[6];
                with = splittedRow[7];
    
                calendar.set(Calendar.YEAR, year);
                calendar.set(Calendar.MONTH, month);
                calendar.set(Calendar.DAY_OF_MONTH, day);
                calendar.set(Calendar.HOUR_OF_DAY, hour);
                calendar.set(Calendar.MINUTE, minute);
                calendar.set(Calendar.SECOND, 0);
    
                AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                Intent alarmIntent = new Intent(this, AlarmReceiver.class);
                alarmIntent.putExtra("note", note + "\nCon: " + with);
                alarmIntent.putExtra("title", "My Memo");
                alarmIntent.putExtra("alarm", "memo");
    
                //requestCode must be incremental to create multiple reminders
                PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode, alarmIntent, 0);
    
                if (calendar.before(Calendar.getInstance())) {
                    calendar.add(Calendar.DATE, 1);
                }
    
                alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
            }
    
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    }

    public class AlarmReceiver extends BroadcastReceiver {
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getStringExtra("alarm").equals("memo")) {
                NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    @SuppressLint("WrongConstant") NotificationChannel notificationChannel = new NotificationChannel("memo_channel", "My Memo", NotificationManager.IMPORTANCE_MAX);
                    notificationChannel.setDescription("Memo Notification Channel");
                    notificationChannel.enableLights(true);
                    notificationChannel.setLightColor(Color.BLUE);
                    notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
                    notificationChannel.enableVibration(true);
                    notificationManager.createNotificationChannel(notificationChannel);
                }
                NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, "memo_channel");
                notificationBuilder.setAutoCancel(true)
                        .setDefaults(Notification.DEFAULT_ALL)
                        .setWhen(System.currentTimeMillis())
                        .setShowWhen(true)
                        .setTicker("Reminder")
                        .setContentTitle("Memo")
                        .setContentText(intent.getStringExtra("note"))
                        .setContentInfo("Information")
                        .setSmallIcon(R.drawable.ic_alarm);
    
                notificationManager.notify(1, notificationBuilder.build());
            }
        }
    }
    
    public class BootAlarmReceiver extends BroadcastReceiver {
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onReceive(Context context, Intent intent) {
                Intent alarmServiceIntent = new Intent(context, AlarmService.class);
                ComponentName service = context.startService(alarmServiceIntent);
    
                if (service == null) {
                    Log.e("ALARM", "Could not start service");
                } else {
                    Log.e("ALARM", "Could start service");
                }
            }
        }
    }
    
    <manifest>
        <application>
            <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
            <uses-permission android:name="android.permission.VIBRATE" />
    
            //Other code here
    
            <receiver
                android:name=".BootAlarmReceiver"
                android:enabled="true">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                </intent-filter>
            </receiver>
            <receiver android:name=".AlarmReceiver" />
            <service android:name=".AlarmService" />
        </application>
    </manifest>
    
    java.lang.RuntimeException: Unable to start receiver com.package.appname.BootAlarmReceiver: java.lang.IllegalStateException: Not allowed to start service Intent { act=REBOOT cmp=com.package.appname/.AlarmService }: app is in background uid UidRecord{a5a4cb2 u0a341 RCVR idle change:uncached procs:1 seq(0,0,0)}
    

    我该怎么办?

  • 共有1个答案

    潘坚白
    2023-03-14

    解决方案:

    嗨,伙计们,我已经发现了我的问题,我的代码是正确的,它运行良好,问题是在我的设备的OS中,从Android OS Oreo开始服务的命令被更改了,需要一个新的命令语法:

    更改在“BootalArmReceiver.java”中。

    public class BootAlarmReceiver extends BroadcastReceiver {
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onReceive(Context context, Intent intent) {
                Intent alarmServiceIntent = new Intent(context, AlarmService.class);
                ComponentName service = context.startService(alarmServiceIntent);
    
                if (service == null) {
                    Log.e("ALARM", "Could not start service");
                } else {
                    Log.e("ALARM", "Could start service");
                }
            }
        }
    }
    
    public class BootAlarmReceiver extends BroadcastReceiver {
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
    
                Intent alarmServiceIntent = new Intent(context, AlarmService.class);
    
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    context.startForegroundService(alarmServiceIntent);
                } else {
                    context.startService(alarmServiceIntent);
                }
            }
        }
    }
    
     类似资料:
    • 问题内容: 有人可以为设置每周重复的几天的警报提供良好的逻辑吗?我已经通过使用每周警报 警报按时触发,并在7天后自动触发。 但是我的要求是我要选择天数,而不是仅仅选择7天。 类似于每个星期一,星期二,星期四的9:00 AM-警报应自动触发。我该如何在setRepeating中执行此操作。 有人可以帮我这个忙吗? 谢谢! 问题答案: 这些问题谈论的都是您想要的。这些答案将有所帮助: 您只需要指定开始

    • 本文向大家介绍Android闹钟设置的解决方案,包括了Android闹钟设置的解决方案的使用技巧和注意事项,需要的朋友参考一下 Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深。下面记录一下,我解决Android闹钟设置的解决方案。 主要问题 1、API19开始AlarmManager的机制修改。 2、应用程序被Kill掉后,设置的闹钟不响。

    • 本文向大家介绍android 设置闹钟及通知示例,包括了android 设置闹钟及通知示例的使用技巧和注意事项,需要的朋友参考一下 简单说一下这次demo内容,首先做一个设置一次性闹钟,先得到alarmManager,打开一个时间对话框,在里面设置闹钟的时间,时间一到发送广播,然后广播接受者接到跳转到新的activity播放音乐。接着是一个反复闹钟,最后是一个简单的通知,具体代码如下: 布局文件(

    • 问题内容: 我正在尝试使用以下代码来获取当前在手机上设置的警报数。 但是当我尝试使用 请让我知道我在做什么错吗?异常发生在getCount()本身中,因此我无法显示警报数量。 编辑: 我也在LogCat上收到此消息: 问题答案: 该你要找的是的,但你不能访问应用的,因为它没有出口。您将只扔一个。

    • 在我的应用程序中,我通过此功能获取手机的位置,但当我重新启动手机并启动应用程序时,我通过此方法获取空值。我有什么遗漏或做错的吗?我应该如何解决此问题? 下面是我使用的函数: 和我的位置侦听器:

    • 本文向大家介绍Android手机闹钟服务AlarmManagerk开发案例,包括了Android手机闹钟服务AlarmManagerk开发案例的使用技巧和注意事项,需要的朋友参考一下 AlarmManager通常用来开发手机闹钟,并且它是一个全局定时器,可在指定时间或指定周期启动其他组件(包括Activity,Service,BroadcastReceiver) 获取AlarmManager对象: