Android: IntentService 突然停止
Android: IntentService suddenly stops
我正在 android 中开发一个跟踪应用程序。
在测试应用程序时我发现了一个问题:
我正在使用 AlarmManager 启动调用 IntentService 的 WakefulBroadcast,在 OnHandleIntent 方法中我从 FusedLocation 调用 requestLocationUpdates(),并启动 Handler/CountDownTimer 到 removeLocationUpdates
问题是有时服务突然停止,没有警告或解释。
并且日志停止显示 locationUpdate 工作或 CountDownTimer 执行
谁能帮我知道为什么我的 IntentService 突然停止了?还是有另一种方法可以在接收位置更新时保持服务 executing/alive?
服务管理器:
public void StartExecuteSubscriptionService(long nextTimeMillis){
Intent intent = new Intent(contextWeakReference.get(),ExecSubscriptionWakefulBroadcast.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(contextWeakReference.get(),
Constants.EXEC_SUBSCRIPTIONS_SERVICE_REQUESTCODE,
intent, 0);
final int SDK_INT = Build.VERSION.SDK_INT;
AlarmManager am = (AlarmManager) contextWeakReference.get().getSystemService(Context.ALARM_SERVICE);
if (SDK_INT < Build.VERSION_CODES.KITKAT) {
am.set(AlarmManager.RTC_WAKEUP, nextTimeInmillis, pendingIntent);
}
else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
am.setExact(AlarmManager.RTC_WAKEUP, nextTimeInmillis, pendingIntent);
}
else if (SDK_INT >= Build.VERSION_CODES.M) {
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nextTimeInmillis, pendingIntent);
}
}
清醒广播:
public class ExecSubscriptionWakefulBroadcast extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, ExecSubscriptionsService.class);
// Start the service, keeping the device awake while it is launching.
CatchExceptionsUtils.saveException(context,new Exception("Ejecutando ExecSubscriptionWakefulBroadcast "+ TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss")));
startWakefulService(context, service);
}
}
执行订阅服务:
@Override
protected void onHandleIntent(@Nullable Intent intent) {
CatchExceptionsUtils.saveException(this,new Exception("Ejecutando ExecSubscriptionService "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss")));
try{
LocationUpdateRequester locationUpdateRequester = new LocationUpdateRequester(this.getApplicationContext(),intent);
locationUpdateRequester.requestLocationUpdates();
}catch (Exception e){
CatchExceptionsUtils.saveException(this,e);
}
}
位置更新请求者:
public void requestLocationUpdates() throws SecurityException {
try{
googleApiClient.connect();
}catch (Exception e){
CatchExceptionsUtils.saveException(contextWeakReference.get(),e);
}
}
@Override
public void onConnected(@Nullable Bundle bundle) throws SecurityException {
try{
CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Conectado a GoogleServices "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss")));
CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Iniciando la busqueda "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss")));
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, TelephonyUtils.createLocationRequest(),listener);
countDownTimer = new CountDownTimer(Constants.TIMEOUT_GPS,20000) {
@Override
public void onTick(long millisUntilFinished) { CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Servicio "+ejecucionId+" encendido y ejecutando"));
}
@Override
public void onFinish() {
CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Ejecutando CountDown "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss")));
LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient,listener);
googleApiClient.disconnect();
releaseWake();
}
}.start();
}catch (Exception e){
CatchExceptionsUtils.saveException(contextWeakReference.get(),e);
releaseWake();
}
}
听众:
LocationListener listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if(location!=null){
CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Guardando registro; " +location.getAccuracy()+" "+location.getLatitude()+" "+location.getLongitude()+" "+TelephonyUtils.getSystemDate("yyyy/MM/dd HH:mm:ss")+" "+ejecucionId));
locationList.add(location);
}
}
};
18 Ejecutando ExecSubscriptionWakefulBroadcast 2017-05-29 15:11:14 2017-05-29 15:11:13.000
18 Ejecutando ExecSubscriptionService 2017-05-29 15:11:15 2017-05-29 15:11:13.000
18 Proxima sucripcion initia en: 0 分钟 2017-05-29 15:11:14.000
18 连接 GoogleServices 2017-05-29 15:11:15 2017-05-29 15:11:14.000
18 连接 GoogleServices 2017-05-29 15:11:15 2017-05-29 15:11:14.000
18 Iniciando la busqueda 2017-05-29 15:11:16 2017-05-29 15:11:14.000
18 只黄蜂 2017-05-29 15:11:16 2017-05-29 15:11:14.000
18 Servicio 1496088675756 encendido y ejecutando 2017-05-29 15:11:14.000
18 Guardando 注册; 2017/05/29 15:11:17 1496088675756 2017-05-29
15:11:15.000
18 Guardando 注册; 2017/05/29 15:11:32 1496088675756 2017-05-29
15:11:31.000
18 服务 1496088675756 encendido y ejecutando 2017-05-29 15:11:34.000
18 Ejecutando ExecSubscriptionService 2017-05-29 15:26:17 2017-05-29 15:26:16.000
这不是 IntentService
的合适用法。一旦 onHandleIntent()
结束,你的 IntentService
就会被销毁。您的进程可以在之后的任何时候终止。
用常规 Service
替换 IntentService
,开始你在 onStartCommand()
的工作。完成服务后请致电 stopSelf()
。
我正在 android 中开发一个跟踪应用程序。
在测试应用程序时我发现了一个问题:
我正在使用 AlarmManager 启动调用 IntentService 的 WakefulBroadcast,在 OnHandleIntent 方法中我从 FusedLocation 调用 requestLocationUpdates(),并启动 Handler/CountDownTimer 到 removeLocationUpdates
问题是有时服务突然停止,没有警告或解释。
并且日志停止显示 locationUpdate 工作或 CountDownTimer 执行
谁能帮我知道为什么我的 IntentService 突然停止了?还是有另一种方法可以在接收位置更新时保持服务 executing/alive?
服务管理器:
public void StartExecuteSubscriptionService(long nextTimeMillis){
Intent intent = new Intent(contextWeakReference.get(),ExecSubscriptionWakefulBroadcast.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(contextWeakReference.get(),
Constants.EXEC_SUBSCRIPTIONS_SERVICE_REQUESTCODE,
intent, 0);
final int SDK_INT = Build.VERSION.SDK_INT;
AlarmManager am = (AlarmManager) contextWeakReference.get().getSystemService(Context.ALARM_SERVICE);
if (SDK_INT < Build.VERSION_CODES.KITKAT) {
am.set(AlarmManager.RTC_WAKEUP, nextTimeInmillis, pendingIntent);
}
else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
am.setExact(AlarmManager.RTC_WAKEUP, nextTimeInmillis, pendingIntent);
}
else if (SDK_INT >= Build.VERSION_CODES.M) {
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nextTimeInmillis, pendingIntent);
}
}
清醒广播:
public class ExecSubscriptionWakefulBroadcast extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, ExecSubscriptionsService.class);
// Start the service, keeping the device awake while it is launching.
CatchExceptionsUtils.saveException(context,new Exception("Ejecutando ExecSubscriptionWakefulBroadcast "+ TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss")));
startWakefulService(context, service);
}
}
执行订阅服务:
@Override
protected void onHandleIntent(@Nullable Intent intent) {
CatchExceptionsUtils.saveException(this,new Exception("Ejecutando ExecSubscriptionService "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss")));
try{
LocationUpdateRequester locationUpdateRequester = new LocationUpdateRequester(this.getApplicationContext(),intent);
locationUpdateRequester.requestLocationUpdates();
}catch (Exception e){
CatchExceptionsUtils.saveException(this,e);
}
}
位置更新请求者:
public void requestLocationUpdates() throws SecurityException {
try{
googleApiClient.connect();
}catch (Exception e){
CatchExceptionsUtils.saveException(contextWeakReference.get(),e);
}
}
@Override
public void onConnected(@Nullable Bundle bundle) throws SecurityException {
try{
CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Conectado a GoogleServices "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss")));
CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Iniciando la busqueda "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss")));
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, TelephonyUtils.createLocationRequest(),listener);
countDownTimer = new CountDownTimer(Constants.TIMEOUT_GPS,20000) {
@Override
public void onTick(long millisUntilFinished) { CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Servicio "+ejecucionId+" encendido y ejecutando"));
}
@Override
public void onFinish() {
CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Ejecutando CountDown "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss")));
LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient,listener);
googleApiClient.disconnect();
releaseWake();
}
}.start();
}catch (Exception e){
CatchExceptionsUtils.saveException(contextWeakReference.get(),e);
releaseWake();
}
}
听众:
LocationListener listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if(location!=null){
CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Guardando registro; " +location.getAccuracy()+" "+location.getLatitude()+" "+location.getLongitude()+" "+TelephonyUtils.getSystemDate("yyyy/MM/dd HH:mm:ss")+" "+ejecucionId));
locationList.add(location);
}
}
};
18 Ejecutando ExecSubscriptionWakefulBroadcast 2017-05-29 15:11:14 2017-05-29 15:11:13.000
18 Ejecutando ExecSubscriptionService 2017-05-29 15:11:15 2017-05-29 15:11:13.000
18 Proxima sucripcion initia en: 0 分钟 2017-05-29 15:11:14.000
18 连接 GoogleServices 2017-05-29 15:11:15 2017-05-29 15:11:14.000
18 连接 GoogleServices 2017-05-29 15:11:15 2017-05-29 15:11:14.000
18 Iniciando la busqueda 2017-05-29 15:11:16 2017-05-29 15:11:14.000
18 只黄蜂 2017-05-29 15:11:16 2017-05-29 15:11:14.000
18 Servicio 1496088675756 encendido y ejecutando 2017-05-29 15:11:14.000
18 Guardando 注册; 2017/05/29 15:11:17 1496088675756 2017-05-29 15:11:15.000
18 Guardando 注册; 2017/05/29 15:11:32 1496088675756 2017-05-29 15:11:31.000
18 服务 1496088675756 encendido y ejecutando 2017-05-29 15:11:34.000
18 Ejecutando ExecSubscriptionService 2017-05-29 15:26:17 2017-05-29 15:26:16.000
这不是 IntentService
的合适用法。一旦 onHandleIntent()
结束,你的 IntentService
就会被销毁。您的进程可以在之后的任何时候终止。
用常规 Service
替换 IntentService
,开始你在 onStartCommand()
的工作。完成服务后请致电 stopSelf()
。