即使应用程序已关闭,如何每天在特定时间显示通知?

How to show a notification everyday at a certain time even when the app is closed?

虽然之前在 Stack Overflow 上可能有人问过这个问题,但我仍然没有找到明确的答案。

例如,我想在每天中午 12 点显示通知,即使应用已关闭。我从那些 link 中引用了:Notifications in specific time every day android, Android daily repeating notification at specific time of a day using AlarmManager, Android BroadcastReceiver on startup - keep running when Activity is in Background 等等……我对 Service 和 BroadcastReceiver 之间的区别感到困惑。我应该使用哪一个?还是我应该同时使用它们?

到目前为止,我知道如何显示通知,但我不知道如何在应用程序关闭时每天自动显示一次。

我的代码:

public class NotifyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, "Service created", Toast.LENGTH_LONG).show();

        Intent resultIntent = new Intent(this, HomeScreen.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0);

        Notification.Builder notification = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("App Title")
                .setContentText("Some Text...")
                .setContentIntent(resultPendingIntent);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT < 16) {
            notificationManager.notify(1, notification.getNotification());
        } else {
            notificationManager.notify(1, notification.build());
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service destroyed", Toast.LENGTH_LONG).show();
    }
}

AppManifest.xml:

<service android:name=".NotifyService" />

我应该如何编写代码来完成我想要的?我能从中理解的任何建议或任何好的link?

如果我没理解错的话,我相信您需要使用 AlarmManager 设置一个循环闹钟。您还需要设置在设备重启时启动警报服务。您可以编写一个方法来执行您想要的操作,以便在警报运行时执行它,例如显示 notification。以下链接应该对您有所帮助:

这是更新的解决方案,有效 Android Oreo

第 1 步: 在您的 MainActivity 中创建一个方法并使用 AlarmManager 在指定时间设置闹钟。

public void myAlarm() {
  
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 21);
    calendar.set(Calendar.MINUTE, 47);
    calendar.set(Calendar.SECOND, 0);
    
    if (calendar.getTime().compareTo(new Date()) < 0) 
        calendar.add(Calendar.DAY_OF_MONTH, 1);

    Intent intent = new Intent(getApplicationContext(), NotificationReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    
    if (alarmManager != null) {
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

  }
  
}

我将闹钟设为 09:47 PM

第 2 步:创建BroadcastReceiver以在警报发生时监听

public class NotificationReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    NotificationHelper notificationHelper = new NotificationHelper(context);
    notificationHelper.createNotification();

   }
}

我正在创建这个名为 NotificationReceiver 的 class 并扩展 BroadcastReceiver,在 onReceive 中有一个名为 NotificationHelper 的 Class,不要不要混淆,我会在接下来的步骤中对此进行解释 Class。

步骤 3: 创建通知 class

class NotificationHelper {

private Context mContext;
private static final String NOTIFICATION_CHANNEL_ID = "10001";

NotificationHelper(Context context) {
    mContext = context;
}

void createNotification()
{
   
    Intent intent = new Intent(mContext , NotificationActivity.class);
   
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent resultPendingIntent = PendingIntent.getActivity(mContext,
            0 /* Request code */, intent,
            PendingIntent.FLAG_UPDATE_CURRENT);


    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID);
    mBuilder.setSmallIcon(R.mipmap.ic_launcher);
    mBuilder.setContentTitle("Title")
            .setContentText("Content")
            .setAutoCancel(false)
            .setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
            .setContentIntent(resultPendingIntent);

    NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
    {
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
        notificationChannel.enableLights(true);
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.enableVibration(true);
        notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
        assert mNotificationManager != null;
        mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
        mNotificationManager.createNotificationChannel(notificationChannel);
    }
    assert mNotificationManager != null;
    mNotificationManager.notify(0 /* Request Code */, mBuilder.build());
       }
     }

这个class处理通知

第 4 步: 返回到 第 2 步: 并调用通知 Class

 NotificationHelper notificationHelper = new NotificationHelper(context);
 notificationHelper.createNotification();

正在注册 BroadcastReceiver 转到您的 Androidmanifest 文件并注册您的广播接收器

<receiver
    android:name=".NotificationReceiver"></receiver>

有关详细信息,请参阅 google

中的 this 指南

希望对你有所帮助

**After Working for a Longer time I want that everyOne should not Waste time so Kindly Approve My ANswer So it will be helpfull for Other developer** 

1-  First Step Create a method which contains your Code where you will define your Time or at what time you want to show the notification.This method need to be called from where you want user to ask for notification.

 public void getNotification () {


            AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);


           Intent intent = new Intent(getApplicationContext(), Notification_receiver.class);

            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            intent.setData((Uri.parse("custom://"+System.currentTimeMillis())));

            alarmManager.cancel(pendingIntent);

            Calendar calendar = Calendar.getInstance();
            Calendar now = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, 16);
            calendar.set(Calendar.MINUTE, 30);
            calendar.set(Calendar.SECOND, 00);
            if (now.after(calendar)) {
                Log.d("Hey","Added a day");
                calendar.add(Calendar.DATE, 1);
            }

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
        }


2- Create a Notification_receiver class which is going to extend Broadcast Receiver here you are going to define your **Channel Id** as it is perfectly working for **API 25 and above** this the Notification_receiver class:



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.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.util.Log;

import androidx.core.app.NotificationCompat;

//Created By Prabhat Dwivedi
public class Notification_receiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationCompat.Builder builder;
        PendingIntent pendingIntent;

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel("Your App Name",
                    "You app Package Name",
                    NotificationManager.IMPORTANCE_HIGH);
            String channel_Id = channel.getId();
            CharSequence channel_name = channel.getName();
            Log.e("Notification_receiver", "channel_Id :" + channel_Id);
            Log.e("channel_name", "channel_name :" + channel_name);

            channel.setDescription("Make entry of today's spending now");
            notificationManager.createNotificationChannel(channel);
        }

        builder = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.yourapp_logo)
                .setChannelId("Your app Name is your Channel Id")
                .setContentTitle("Your title")
                .setContentText("Your Description")
                .setAutoCancel(true);

//nder this you will find intent it is going to define after clicking notification which activity you want to redirect
        Intent repeatingIntent = new Intent(context, HomePage.class);
         pendingIntent = PendingIntent.getActivity(context, 100, repeatingIntent,    PendingIntent.FLAG_UPDATE_CURRENT);
        builder.setContentIntent(pendingIntent);
        notificationManager.notify(100, builder.build());
    }
    }