安装后没有收到通知吗?

问题描述

我正在开发带有通知的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 (将#修改为@)