如何通过后台服务每天在android中的特定时间重复通知

use*_*918 24 service android broadcastreceiver alarm

嗨,我正在申请我已通过后台服务设置用户输入日期和时间的通知.现在我想在每天下午6点设置通知/闹钟,询问用户是否要添加其他条目?我怎样才能做到这一点?我应该使用相同的后台服务还是广播接收器?请给我更好的解决方案,教程将是个好主意.提前致谢.

Mr.*_*Rao 59

首先将警报管理器设置如下

 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);
Run Code Online (Sandbox Code Playgroud)

在onReceive中创建广播接收器类"AlarmReceiver"会引发通知

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

    }

}
Run Code Online (Sandbox Code Playgroud)

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

<receiver android:name=".AlarmReceiver"/>
Run Code Online (Sandbox Code Playgroud)

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

  • 我会添加`if(calendar.getTime().compareTo(new Date())<0)calendar.add(Calendar.DAY_OF_MONTH,1);`到日历初始化,以避免在你设置的时间已经过时立即通知通过"今天". (12认同)
  • @NVRao` <uses-permission android:name ="com.android.alarm.permission.SET_ALARM"/>`不是必需的.它用于在设备的闹钟中设置闹钟. (7认同)
  • @NVRao感谢所有寻求设置通知ID的最佳实践的人,请检查这个问题的答案:http://stackoverflow.com/questions/25713157/generate-int-unique-id-as-android-notification- ID (3认同)
  • 什么是“EVentsPerform”类? (3认同)
  • 从API 19开始,AlarmManager中的`setRepeating`是不精确的(参见https://developer.android.com/reference/android/app/AlarmManager.html).你应该使用`setExact`(API 19-22)或`setExactAndAllowWhileIdle`(API 23+).请注意,这是一次性警报,因此当您在AlarmReceiver的`onReceived()`中收到警报时,必须再次设置警报. (2认同)