如何在提醒应用中打开应用的主要活动并同时获得通知?

问题描述

在这里,我正在开发带有警报和通知的任务提醒应用程序。就我而言,我必须点击通知以打开主要活动。但是我需要获得通知并同时打开主要活动。怎么做?有人可以在这方面帮助我吗? MainActivity具有用户添加的任务列表

Main Activity

AlarmReciever.java

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 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";


    
    @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;
        }

        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);
            }
        }

    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)