El servicio de Android no se detiene después de cancelar
Frecuentes
Visto 376 veces
0
Tengo un widget que inicia 2 servicios usando AlaramManager y ejecutándolos repetidamente:
public static final String TAG = "RotterWidgetProvider";
public static ArrayList<SubjectObject> subjectsList;
public static boolean isUpdated=true;
public static int currentSubject=0;
private PendingIntent serviceShowNextSubject = null;
private PendingIntent serviceDownloadSubjects = null;
Intent i=null;
Intent i2=null;
@Override
public void onUpdate(final Context context, final AppWidgetManager appWidgetManager,int[] appWidgetIds)
{
RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.rotter_appwidget_layout);
Intent launchAppIntent = new Intent(context, WidgetSettings.class);
PendingIntent launchAppPendingIntent = PendingIntent.getActivity(context,
0, launchAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteView.setOnClickPendingIntent(R.id.imgWidgetSettings, launchAppPendingIntent);
if(subjectsList==null)
{
remoteView.setTextViewText(R.id.txtSubject,"נא לחכות, טוען נתונים");
ComponentName RotterListWidget = new ComponentName(context,
RotterWidgetProvider.class);
appWidgetManager.updateAppWidget(RotterListWidget, remoteView);
final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
final Calendar TIME = Calendar.getInstance();
TIME.set(Calendar.MINUTE, 0);
TIME.set(Calendar.SECOND, 0);
TIME.set(Calendar.MILLISECOND, 0);
if(i==null)
{
i = new Intent(context, UpdateRotterWidgetService.class);
Log.v(TAG,"UpdateRotterWidgetService Created");
}
if(i2==null)
{
i2 = new Intent(context, DownloadSubjectsService.class);
Log.v(TAG,"DownloadSubjectsService Created");
}
if (serviceShowNextSubject == null)
{
serviceShowNextSubject = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
Log.v(TAG,"serviceShowNextSubject initialized");
}
if(serviceDownloadSubjects==null)
{
serviceDownloadSubjects=PendingIntent.getService(context, 0, i2, PendingIntent.FLAG_CANCEL_CURRENT);
Log.v(TAG,"serviceDownloadSubjects initialized");
}
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
String subjectsDownloadInterval=settings.getString("SubjectsDownloadInterval", "10");
String subjectsUpdateInterval=settings.getString("SubjectsUpdateInterval", "10");
int down=10;
int upd=10;
try
{
down=Integer.parseInt(subjectsDownloadInterval);
upd=Integer.parseInt(subjectsUpdateInterval);
}
catch(Exception e)
{
}
m.setRepeating(AlarmManager.RTC, TIME.getTime().getTime(), 1000 * 60*down, serviceDownloadSubjects);
m.setRepeating(AlarmManager.RTC, TIME.getTime().getTime(), 1000 * upd, serviceShowNextSubject);
}
}
Después de eliminar el Widget de la pantalla, cancelo los servicios:
@Override
public void onDisabled(Context context)
{
final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
m.cancel(serviceShowNextSubject);
m.cancel(serviceDownloadSubjects);
}
Pero los servicios no se cancelan y siguen ejecutándose en segundo plano. ¿Cual puede ser el problema?
1 Respuestas
1
Cancelar las alarmas no detendrá los servicios. Debe detenerlos manualmente o hacer que el tiempo se detenga después de que terminen su trabajo.
Respondido el 12 de junio de 12 a las 09:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas android android-widget android-service alarmmanager repeatingalarm or haz tu propia pregunta.
¿Cómo puedo detenerlos manualmente cuando el widget se elimina de la pantalla? - Alex
¿Qué hacen exactamente sus servicios? ¿Puedes hacer que se detengan solos después de terminar? Esta es la solución más limpia. - Nikolái Elenkov
El primer servicio descarga algunos datos del servidor cada X minutos, el segundo servicio actualiza el widget cada X segundos con nuevos datos, deben detenerse solo si el widget se elimina de la pantalla. - Alex
No del todo: si está utilizando AlaramManager, su servicio de descarga se iniciará cada X minutos. Así que puedes detenerlo después de que se esté descargando. Lo mismo con el otro servicio: prográmelo para que se ejecute cada X segundos (eso es excesivo, incluso para un widget) y deténgalo cuando termine de actualizarse. - Nikolái Elenkov
Traté de detener el desde adentro: stopSelf() en el servicio mismo, pero sigue funcionando. - Alex