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

时间:2015-10-10 14:34:45

标签: android android-intent android-service android-notifications android-alarms

虽然Stack Overflow之前可能已经提出过这个问题,但我仍然没有找到明确的答案。

我想每天在中午12点显示通知,例如,即使应用已关闭。我引用了这些链接:Notifications in specific time every day androidAndroid daily repeating notification at specific time of a day using AlarmManagerAndroid 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" />

我应该如何编写代码来实现我想要的目标?我可以理解的任何建议或任何好的链接?

3 个答案:

答案 0 :(得分:9)

如果我理解正确,我相信您需要使用AlarmManager设置定期闹钟。您还需要在设备重启时设置启动警报服务。您可以编写一个执行所需操作的方法,以便在警报运行时执行,例如显示notification。以下链接可以帮助您:

答案 1 :(得分:0)

这是更新的解决方案,可以在Android Oreo上使用

步骤1:MainActivity中创建方法,并使用AlarmManager在指定时间设置闹钟。

public void sharedpref(){

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    if (!prefs.getBoolean("FirstTime", false)) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY,21);
    calendar.set(Calendar.MINUTE,47);
    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);
    }

        SharedPreferences.Editor editor = prefs.edit();
        editor.putBoolean("FirstTime", true);
        editor.apply();
    }
}

我将闹钟设置为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的类,并扩展了BroadcastReceiver,在onReceive中有一个名为NotificationHelper的类,请不要混淆,我将在下一节中解释该类脚步。

步骤3:创建通知类

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

} 此类处理通知

第4步:回到第2步并创建呼叫通知类

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

希望它能帮助您解决问题。

答案 2 :(得分:0)

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