在Android中使用AlarmManager替换服务

时间:2016-04-27 01:42:11

标签: android service alarmmanager android-alarms

我有一个Android服务来从网上获取每十五分钟运行一次的数据

public class SparkService extends Service {

    Handler handler;

    public SparkService() {
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.e("Starting Sevice", "Starting Service Successfully.");

        if (handler == null) {
            handler = new Handler(new Handler.Callback() {
                @Override
                public boolean handleMessage(Message msg) {
                    fetchDataFromServer();
                    handler.removeMessages(120);
                    handler.sendEmptyMessageDelayed(120, 15 * 60 * 1000);
                    return true;
                }
            });
        }

        handler.sendEmptyMessageDelayed(120, 15 * 60 * 1000);

        return Service.START_STICKY;
    }
}

我发现这项服务有时不可靠,而且如果应用程序在一段时间内处于非活动状态,似乎没有被调用。我想用AlarmManager服务替换服务。我的应用程序目前正在制作中。我是否可以删除SparkService类并添加另一个Alarm服务类,而不会影响更新应用程序的现有用户?或者我是否必须在我的应用更新中停止此SparkService,以便应用程序可以正常运行?

2 个答案:

答案 0 :(得分:1)

您的应用是您的切入点。因此,如果它被杀死意味着与其进程相关的所有服务也将被杀死,就像你在Windows中杀死svchost.exe进程一样,所有子进程如Windows更新服务也将被停止并且不会运行再次启动更新管理器。

您的应用程序也是如此:Service通过杀死您的应用程序而停止的唯一方式(而且我不确定但是它可能是),如果使用Service中的特殊标记,使用自己的流程创建Manifest

我认为在您的情况下,您没有设置该标记,因此只有在您的应用在更新后启动时才会安排Service,在这种情况下Service的行为将根据新代码。

答案 1 :(得分:-1)

要回答您的第一个问题,即使您从更新用户中删除旧版本的服务也不会受到影响,直到他们使用新版本更新版本

现在使用闹钟管理器来触发后端的更新,因为你说这是一个很好的做法,因为警报管理器有不同的设置,你可以根据或需要使用下面的简短示例如何使用它

// Get alarm manager instance
    AlarmManager alarmManager = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    Calendar calendar;
    Intent intent;
    PendingIntent pendingIntent;
    // Schedule
    intent = new Intent(getApplicationContext(), YourCustomBroadcastReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);

    calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 1); // first time
    alarmManager.setRepeating(
            AlarmManager.RTC_WAKEUP,
            calendar.getTimeInMillis(),
            60*5*1000,//Each five minutes
            pendingIntent
    );

在你的广播接收器中

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class YourBroadcastReceiver extends BroadcastReceiver{
publicYourBroadcastReceiver() {}
@Override
public void onReceive(Context context, Intent intent) {
    Intent serviceIntent = new Intent(context.getApplicationContext(),YourService.class);
    context.startService(serviceIntent);
}

}

这里有关于警报管理器的更多详细信息 http://developer.android.com/training/scheduling/alarms.html