【问题标题】:How to repeat notification daily on specific time in android through background service如何通过后台服务在android中的特定时间每天重复通知
【发布时间】:2014-06-19 20:28:08
【问题描述】:

您好,我正在开发应用程序,我通过后台服务设置了用户输入日期和时间的通知。现在我想在每天下午 6 点设置通知/警报来询问用户是否要添加另一个条目? 我怎样才能做到这一点?我应该使用相同的后台服务还是广播接收器? 请为此提供更好的解决方案,教程将是个好主意。 提前致谢。

【问题讨论】:

标签: android service broadcastreceiver alarm


【解决方案1】:

首先如下设置报警管理器

 Calendar calendar = Calendar.getInstance();
 calendar.set(Calendar.HOUR_OF_DAY, 18);
 calendar.set(Calendar.MINUTE, 30);
 calendar.set(Calendar.SECOND, 0);
 Intent intent1 = new Intent(MainActivity.this, AlarmReceiver.class);
 PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0,intent1, PendingIntent.FLAG_UPDATE_CURRENT);
 AlarmManager am = (AlarmManager) MainActivity.this.getSystemService(MainActivity.this.ALARM_SERVICE);
 am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

在此创建一个广播接收器类“AlarmReceiver” onReceive 时的通知

public class AlarmReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        long when = System.currentTimeMillis();
        NotificationManager notificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);

        Intent notificationIntent = new Intent(context, EVentsPerform.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);


        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
                context).setSmallIcon(R.drawable.applogo)
                .setContentTitle("Alarm Fired")
                .setContentText("Events to be Performed").setSound(alarmSound)
                .setAutoCancel(true).setWhen(when)
                .setContentIntent(pendingIntent)
                .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
        notificationManager.notify(MID, mNotifyBuilder.build());
        MID++;

    }

}

在清单文件中,为 AlarmReceiver 类注册接收器:

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

通过警报管理器引发事件不需要特殊权限。

【讨论】:

  • @N.V.Rao &lt;uses-permission android:name="com.android.alarm.permission.SET_ALARM"/&gt; 不是必需的。用于在设备的闹钟中设置闹钟。
  • 我会将if(calendar.getTime().compareTo(new Date()) &lt; 0) calendar.add(Calendar.DAY_OF_MONTH, 1); 添加到日历初始化中,以避免在您设置的时间已经过了“今天”时立即通知。
  • @N.V.Rao 谢谢,对于寻找设置通知 ID 的最佳实践的其他人,请查看此问题的答案:stackoverflow.com/questions/25713157/…
  • 从 API 19 开始,AlarmManager 中的setRepeating 不精确(请参阅developer.android.com/reference/android/app/AlarmManager.html)。您应该使用 setExact (API 19-22) 或 setExactAndAllowWhileIdle (API 23+)。请注意,这是一次性警报,所以当您在AlarmReceiver的onReceived()收到警报时,您必须重新设置警报。
  • 什么是“EVentsPerform”类?
【解决方案2】:

N.V.Rao 的回答是正确的,但是不要忘记将receiver 标签放在AndroidManifest.xml 文件中的应用标签内:

<receiver android:name=".alarm.AlarmReceiver" />

【讨论】:

  • 感谢您的指出。您可以编辑@Mr,而不是将其添加为单独的答案。 N.V.Rao 的回答
【解决方案3】:

2021 年,4 月
这是 Android 中特定时间(此处为上午 8 点)每日重复通知的示例代码:-
1. MainActivity.class

package com.manab.notificationx;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.util.Calendar;


public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super .onCreate(savedInstanceState) ;
        setContentView(R.layout.activity_main ) ;

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 08);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    if (calendar.getTime().compareTo(new Date()) < 0) calendar.add(Calendar.HOUR_OF_DAY, 0);
    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);
    }
    }


}    

AlarmReceiver.class // 这是后台进程需要的广播接收器

package com.manab.notificationx;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;

public class AlarmReceiver extends BroadcastReceiver {
    private static final String CHANNEL_ID = "this.is.my.channelId";//you can add any id you want
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent notificationIntent = new Intent(context, NotificationActivity.class);//on tap this activity will open

        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addParentStack(NotificationActivity.class);
        stackBuilder.addNextIntent(notificationIntent);

        PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);//getting the pendingIntent

        Notification.Builder builder = new Notification.Builder(context);//building the notification

        Notification notification = builder.setContentTitle("Demo App Notification")
                .setContentText("New Notification From Demo App..")
                .setTicker("New Message Alert!")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pendingIntent).build();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            builder.setChannelId(CHANNEL_ID);
        }

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//below creating notification channel, because of androids latest update, O is Oreo
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                    CHANNEL_ID,
                    "NotificationDemo",
                    NotificationManager.IMPORTANCE_DEFAULT
            );
            notificationManager.createNotificationChannel(channel);
        }

        notificationManager.notify(0, notification);
    }
}

NotificationActivity.class //记住这是一个activity,不是class,所以创建一个空activity。

package com.manab.notificationx;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class NotificationActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_notification);
    }
}

AndroidManifest.xml // 只需在下面添加指示行

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.manab.notificationx">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.NotificationX">
        <activity android:name=".NotificationActivity"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".AlarmReceiver" />//copy only this line of code
    </application>

</manifest>

让我知道它是否有效

【讨论】:

  • 现在工作兄弟:D
  • @Moataz,很高兴知道
  • 工作,但问题是它每次打开应用程序时都会通知,尽管时间已经暂停
  • 我已经编辑了答案,现在应该可以完美运行了。
猜你喜欢
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多