从AlarmManager启动的服务启动新的警报

时间:2016-09-15 00:23:47

标签: android

在我的应用中,我使用AlarmManager每周在特定时间开始服务。但在某些情况下,我需要在第二天拨打该服务,而不是等待另外7天。因为我没有使用reapeating报警,而是在启动的服务中,我正在创建新的报警并将其设置为特定日期。像这样:

public class AlarmService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    //do something 

    //setting new alarm
    AlarmManager alarmMng = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(this,AlarmService.class);
    PendingIntent alarmIntent = PendingIntent.getService(this, 0, i, 0);
    Calendar c = Calendar.getInstance();
    if(something) alarmMng.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis()+1000*60*60*24,alarmIntent);
    else alarmMng.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis()+1000*60*60*24*7,alarmIntent);
    return START_STICKY;
}

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

一切正常但我不知道这是不是很好的方法。从一个刚刚调用的服务创建新警报是一个好主意吗?它被认为是糟糕的编程习惯吗?如果是这样,我该如何处理呢?

1 个答案:

答案 0 :(得分:2)

  

它被认为是糟糕的编程习惯吗?

否 - 这是创建警报事件的一个很好的用例。如果您查看文档,使用AlarmManager旨在将事件发送到您的应用,即使它没有运行。在Service中接收那些然后安排另一个警报事件的事件是完全正常的。我的其余部分旨在解释如何回答您提出的其他问题:

  

从刚才的服务创建新警报是一个好主意   被一个人打电话?

确定您是否需要Service确实取决于"做某事"代码的一部分不仅仅是设置闹钟。例如,您可以使用IntentService甚至是BroadcastReceiver

编辑: 换句话说,您需要一个后台进程来处理这个问题。确定适当的后台进程(ReceiverService)取决于需要处理多少处理。通常,单独设置警报可能会在Receiver中处理,但如果处理时间太长(例如超过10秒),则会出现ANR(应用程序无响应)崩溃。那是您需要服务的时候。

结束编辑..

这是一篇关于服务的好文章:Service vs IntentService

具体来说,您应该关注的是,如果您的服务被多次调用,您可能应该在设置新警报之前包含用于取消之前创建的任何警报的代码。

编辑:此外,您不是"创建新服务"或者"新警报"每一次。每次向其发送意图时(onStartCommand或通过任何其他方式),服务都会调用AlarmManager。除非尚未实例化,否则不会创建新实例。