我正在开发一个集成了提醒功能的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)}
我该怎么办?
解决方案:
嗨,伙计们,我已经发现了我的问题,我的代码是正确的,它运行良好,问题是在我的设备的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对象: