我有一个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,以便应用程序可以正常运行?
答案 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