【问题标题】:Display notification daily with AlarmManager and Service使用 AlarmManager 和 Service 每天显示通知
【发布时间】:2015-05-02 23:04:27
【问题描述】:

我想每天显示一个通知,但是该通知不时显示。到目前为止,我还没有弄清楚模式。

在我的MainActivity#onCreate 中,我执行以下代码来启动它:

final Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.add(Calendar.DAY_OF_YEAR, 1);

final AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, getPendingIntentForDailyReminderService(context));

为了停止 AlarmManager,我有这个代码(它只在用户更改首选项时执行):

final AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.cancel(getPendingIntentForDailyReminderService(context));

函数getPendingIntentForDailyReminderService定义如下:

final Intent intent = new Intent(context, DailyReminderService.class);
return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

这是我的服务类:

public class DailyReminderService extends Service {
    private static final int NOTIFICATION_ID = 1;

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

    @Override
    public int onStartCommand(final Intent intent, final int flags, final int startId) {
        final String contentText = this.getString(R.string.daily_reminder_text);

        final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setContentTitle(this.getString(R.string.app_name));
        builder.setContentText(contentText);
        builder.setSmallIcon(R.drawable.ic_notification_icon);
        builder.setStyle(new NotificationCompat.BigTextStyle().bigText(contentText));

        final PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
        builder.setContentIntent(pendingIntent);

        final Notification notification = builder.build();
        notification.flags = Notification.FLAG_ONLY_ALERT_ONCE | Notification.FLAG_AUTO_CANCEL;

        final NotificationManager notificationManager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(NOTIFICATION_ID, notification);

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        final NotificationManager notificationManager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
        notificationManager.cancel(NOTIFICATION_ID);

        super.onDestroy();
    }
}

我还在 Manifest 中注册了该服务:

<service
    android:name=".dailyreminder.DailyReminderService"
    android:enabled="true"
    android:exported="true">

我做错了什么?

【问题讨论】:

    标签: android android-service android-notifications


    【解决方案1】:

    正确的做法是使用BroadcastReceiver 而不是Service

    如果你从onStartCommand返回START_STICKY并且从未显式停止服务,则每次服务因资源不足而被杀死时,操作系统将在稍后有资源时尝试重新启动服务这样做。

    【讨论】:

    • 所以我在Service#onStartCommand 中的代码将进入BroadcastReceiver#onReceive ?
    • @Niklas 大部分情况下是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多