问题描述
我正在开发带有通知的android任务提醒应用。就我而言,我需要获取通知并在达到设置的时间后打开editAlarm活动。
但是在尝试设置第一个提醒(任务)时,在手机上安装了应用程序后,我没有收到通知,也没有打开EditAlarm活动。然后,我试图设置第二个提醒(任务),它工作正常。
为什么在手机上安装应用程序后,我的第一个提醒(任务)无法得到通知?
*** EditAlarm不是我应用程序中的主要活动
这里是获取通知并打开EditAlarmActivity的代码
package com.example.taskreminder.service;
import android.app.AlarmManager;
import android.app.AlarmManager.AlarmClockInfo;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.notificationmanager;
import android.app.PendingIntent;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.ringtoneManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import com.example.taskreminder.ui.AddEditAlarmActivity;
import com.example.taskreminder.ui.AlarmlandingPageFragment;
import com.example.taskreminder.ui.MainActivity;
import com.example.taskreminder.model.Alarm;
import com.example.taskreminder.ui.MainActivity;
import com.example.taskreminder.util.AlarmUtils;
import com.example.taskreminder.R;
import java.util.Calendar;
import java.util.List;
import static android.app.notificationmanager.IMPORTANCE_HIGH;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
import static android.app.PendingIntent.getActivity;
import static android.os.Build.VERSION.SDK_INT;
import static android.os.Build.VERSION_CODES.KITKAT;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static android.os.Build.VERSION_CODES.O;
import static com.example.taskreminder.ui.AlarmlandingPageActivity.launchIntent;
public final class AlarmReceiver extends broadcastReceiver {
private static final String TAG = AlarmReceiver.class.getSimpleName();
private static final String CHANNEL_ID = "alarm_channel";
private static final String BUNDLE_EXTRA = "bundle_extra";
private static final String ALARM_KEY = "alarm_key";
//Have Add new code to intent main activity
@Override
public void onReceive(Context context,Intent intent) {
final Alarm alarm = intent.getBundleExtra(BUNDLE_EXTRA).getParcelable(ALARM_KEY);
if(alarm == null) {
Log.e(TAG,"Alarm is null",new NullPointerException());
return;
}
//Try to open EditAlarm Activity
Intent launchEditAlarmIntent = AddEditAlarmActivity.buildAddEditAlarmActivityIntent(
context,AddEditAlarmActivity.EDIT_ALARM);
launchEditAlarmIntent.putExtra(AddEditAlarmActivity.ALARM_EXTRA,alarm);
launchEditAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(launchEditAlarmIntent);
final int id = alarm.notificationId();
final notificationmanager manager =
(notificationmanager) context.getSystemService(Context.NOTIFICATION_SERVICE);
createNotificationChannel(context);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context,CHANNEL_ID);
builder.setSmallIcon(R.drawable.logo);
builder.setColor(ContextCompat.getColor(context,R.color.accent));
builder.setContentTitle(context.getString(R.string.app_name));
builder.setContentText(alarm.getLabel());
builder.setTicker(alarm.getLabel());
builder.setVibrate(new long[] {1000,500,1000,500});
builder.setSound(ringtoneManager.getDefaultUri(ringtoneManager.TYPE_NOTIFICATION));
builder.setContentIntent(launchAlarmlandingPage(context,alarm));
builder.setAutoCancel(true);
builder.setPriority(Notification.PRIORITY_HIGH);
manager.notify(id,builder.build());
//Reset Alarm manually
setReminderAlarm(context,alarm);
}
//Convenience method for setting a notification
public static void setReminderAlarm(Context context,Alarm alarm) {
//Check whether the alarm is set to run on any days
if(!AlarmUtils.isAlarmActive(alarm)) {
//If alarm not set to run on any days,cancel any existing notifications for this alarm
cancelReminderAlarm(context,alarm);
return;
}
final Calendar nextAlarmTime = getTimeForNextAlarm(alarm);
alarm.setTime(nextAlarmTime.getTimeInMillis());
final Intent intent = new Intent(context,AlarmReceiver.class);
final Bundle bundle = new Bundle();
bundle.putParcelable(ALARM_KEY,alarm);
intent.putExtra(BUNDLE_EXTRA,bundle);
final PendingIntent pIntent = PendingIntent.getbroadcast(
context,alarm.notificationId(),intent,FLAG_UPDATE_CURRENT
);
ScheduleAlarm.with(context).schedule(alarm,pIntent);
}
public static void setReminderAlarms(Context context,List<Alarm> alarms) {
for(Alarm alarm : alarms) {
setReminderAlarm(context,alarm);
}
}
/**
* Calculates the actual time of the next alarm/notification based on the user-set time the
* alarm should sound each day,the days the alarm is set to run,and the current time.
* @param alarm Alarm containing the daily time the alarm is set to run and days the alarm
* should run
* @return A Calendar with the actual time of the next alarm.
*/
private static Calendar getTimeForNextAlarm(Alarm alarm) {
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(alarm.getTime());
final long currentTime = System.currentTimeMillis();
final int startIndex = getStartIndexFromTime(calendar);
int count = 0;
boolean isAlarmSetForDay;
final SparseBooleanArray daysArray = alarm.getDays();
do {
final int index = (startIndex + count) % 7;
isAlarmSetForDay =
daysArray.valueAt(index) && (calendar.getTimeInMillis() > currentTime);
if(!isAlarmSetForDay) {
calendar.add(Calendar.DAY_OF_MONTH,1);
count++;
}
} while(!isAlarmSetForDay && count < 7);
return calendar;
}
public static void cancelReminderAlarm(Context context,Alarm alarm) {
final Intent intent = new Intent(context,AlarmReceiver.class);
final PendingIntent pIntent = PendingIntent.getbroadcast(
context,FLAG_UPDATE_CURRENT
);
final AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.cancel(pIntent);
}
private static int getStartIndexFromTime(Calendar c) {
final int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
int startIndex = 0;
switch (dayOfWeek) {
case Calendar.MONDAY:
startIndex = 0;
break;
case Calendar.TUESDAY:
startIndex = 1;
break;
case Calendar.WednESDAY:
startIndex = 2;
break;
case Calendar.THURSDAY:
startIndex = 3;
break;
case Calendar.FRIDAY:
startIndex = 4;
break;
case Calendar.SATURDAY:
startIndex = 5;
break;
case Calendar.SUNDAY:
startIndex = 6;
break;
}
return startIndex;
}
private static void createNotificationChannel(Context ctx) {
if(SDK_INT < O) return;
final notificationmanager mgr = ctx.getSystemService(notificationmanager.class);
if(mgr == null) return;
final String name = ctx.getString(R.string.channel_name);
if(mgr.getNotificationChannel(name) == null) {
final NotificationChannel channel =
new NotificationChannel(CHANNEL_ID,name,IMPORTANCE_HIGH);
channel.enableVibration(true);
channel.enableLights(true);
channel.setVibrationPattern(new long[] {1000,500});
channel.setBypassDnd(true);
mgr.createNotificationChannel(channel);
}
}
private static PendingIntent launchAlarmlandingPage(Context ctx,Alarm alarm) {
return PendingIntent.getActivity(
ctx,launchIntent(ctx),FLAG_UPDATE_CURRENT
);
}
private static class ScheduleAlarm {
@NonNull private final Context ctx;
@NonNull private final AlarmManager am;
private ScheduleAlarm(@NonNull AlarmManager am,@NonNull Context ctx) {
this.am = am;
this.ctx = ctx;
}
static ScheduleAlarm with(Context context) {
final AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if(am == null) {
throw new IllegalStateException("AlarmManager is null");
}
return new ScheduleAlarm(am,context);
}
void schedule(Alarm alarm,PendingIntent pi) {
if(SDK_INT > LOLLIPOP) {
am.setAlarmClock(new AlarmClockInfo(alarm.getTime(),launchAlarmlandingPage(ctx,alarm)),pi);
} else if(SDK_INT > KITKAT) {
am.setExact(AlarmManager.RTC_WAKEUP,alarm.getTime(),pi);
} else {
am.set(AlarmManager.RTC_WAKEUP,pi);
}
}
}
}
这是我的清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.taskreminder">
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@drawable/logo"
android:roundIcon="@drawable/logo"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ui.splash_screen" android:theme="@style/Theme.AppCompat.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.MainActivity">
</activity>
<activity android:name=".ui.AddEditAlarmActivity" />
<activity
android:name=".ui.AlarmlandingPageActivity"
android:theme="@style/AlertLandingPageTheme" />
<service android:name=".service.LoadAlarmsService" />
<receiver android:name=".service.LoadAlarmsReceiver" />
<receiver android:name=".service.AlarmReceiver" />
<receiver
android:name=".service.BootReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="${bootPriority}">
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)