如果没有使用AlarmManager运行,请启动服务

时间:2013-02-01 09:18:22

标签: android service alarmmanager

我有由AlarmManager启动的服务喜欢这个

Intent in = new Intent(SecondActivity.this,BotService.class);
                    PendingIntent pi = PendingIntent.getService(SecondActivity.this, 9768, in,PendingIntent.FLAG_UPDATE_CURRENT);

                    AlarmManager alarms = (AlarmManager) SecondActivity.this.getSystemService(Context.ALARM_SERVICE);
                    alarms.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),pi);

当服务启动时,它再次设置AlarmManager,我这样做是因为我需要以随机间隔重复服务。

这是由此完成的:

Intent in = new Intent(BotService.this, BotService.class);
            PendingIntent pi = PendingIntent.getService(BotService.this, 9768,
                    in, PendingIntent.FLAG_UPDATE_CURRENT);

            AlarmManager alarms = (AlarmManager) BotService.this.getSystemService(Context.ALARM_SERVICE);
            alarms.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+ (attack_interval * MINS) + attack_interval_min, pi);

我的服务可能会持续一段时间,如果服务没有运行,如何通过AlarmManager启动服务?

如果它正在运行,我需要再次设置AlarmManager,因为在其他方面我的服务不会再次启动。谢谢您的回答。如果有什么不清楚请问。

2 个答案:

答案 0 :(得分:1)

您可能希望实现IntentService;如果方法适合您的需要,那么你将摆脱所有生命周期的麻烦。

另外,为什么不通过setInexactRepeating或setRepeating设置重复闹铃?当然,如果您确定IntentService的运行时间从不超过警报间隔,或者当您的IntentService仍在运行时有另一种合理的机制来忽略警报,那么您只会这样做。

更新:如果您还在询问如何最初启动服务......那么,这取决于。许多人将BOOT_COMPLETED广播视为一切的解决方案。但是,它会阻止用户将您的应用程序移动到SD卡。如果只有在运行应用程序后才能重复运行您的服务,您的应用程序可以启动此操作。 Othewrwise,如果您查看系统发送的可能与您的服务相关的其他事件(例如互联网连接的更改),您仍可以避开BOOT_COMPLETED陷阱。如果您决定使用BOOT_COMPLETED,则可以找到示例here

答案 1 :(得分:0)

如果查看文档。服务启动时,它有一个startID,可用于确定在给定时间运行的服务实例的数量。

参见:

public int onStartCommand (Intent intent, int flags, int startId)

Added in API level 5
Called by the system every time a client explicitly starts the service by calling startService(Intent), providing the arguments it supplied and a unique integer token representing the start request. Do not call this method directly.

For backwards compatibility, the default implementation calls onStart(Intent, int) and returns either START_STICKY or START_STICKY_COMPATIBILITY.

If you need your application to run on platform versions prior to API level 5, you can use the following model to handle the older onStart(Intent, int) callback in that case. The handleCommand method is implemented by you as appropriate: