延迟后开始服务

时间:2013-08-16 11:28:33

标签: android

我已经开发了一个在活动开始时自动启动的服务。 但是我希望在一定时间间隔10秒后停止服务,并在30秒后说一段时间后再次开始服务。 我对android编程有点新,所以没有得到如何做到这一点,请帮忙。 我正在使用广播接收器来启动服务。

3 个答案:

答案 0 :(得分:5)

我建议使用警报管理器并发送待处理的意图来启动服务。很像这样:

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent serviceIntent = new Intent(context, ServiceReceiver.class); 
PendingIntent pi = PendingIntent.getBroadcast(context, ServiceIdsConstants.SERVICE_ID,     serviceIntent , PendingIntent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 30000, pi);

然后在BroadcastReceiver中执行此操作:

Intent intent = new Intent(context, MyServiceService.class);
context.startService(intent);

答案 1 :(得分:1)

你需要将你的任务分解成比这更原始的部分。然后你可以看到谷歌需要什么,并将获得更好的结果:)

  1. 在另一个帖子上使用scheduler to schedule a new task
  2. 'sleep' the thread,持续X毫秒。
  3. 使用您的意图和广播接收者开始您的服务
  4. 此外(优越方法),使用警报管理器how to schedule some code execution in android or: what exactly are daemon threads in android?

答案 2 :(得分:0)

刚写了一个你和其他人可以使用的实用工具:

userService

public static void startDelayedWakefulService(Context context,long delayInMillis,Class<? extends Service> serviceClass) {
    AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent serviceIntent = new Intent(context, DelayedStartServiceBroadcastReceiver.class);
    serviceIntent.putExtra("className",serviceClass.getName());
    PendingIntent pi= PendingIntent.getBroadcast(context, 7, serviceIntent , PendingIntent.FLAG_UPDATE_CURRENT);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeInMillis()+delayInMillis, pi);
}

别忘了将它添加到你的清单

public class DelayedStartServiceBroadcastReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String className = intent.getStringExtra("className");
        try {
            startWakefulService(context,new Intent(context,Class.forName(className)) );
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            completeWakefulIntent(intent);
        }
    }
}