Este es el método que he utilizado y parece que funciona bastante bien:
que tienen una clase de aplicaciones de nivel superior de mi propia que se extiende aplicación como tal
public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {
También necesita registro este objeto Aplicación en el archivo de manifiesto:
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:name=".MyApplication">
Note como también implementar la interfaz ActivityLifeCycleCallbacks. Esta interfaz tiene los siguientes métodos:
public static interface ActivityLifecycleCallbacks {
void onActivityCreated(android.app.Activity activity, android.os.Bundle bundle);
void onActivityStarted(android.app.Activity activity);
void onActivityResumed(android.app.Activity activity);
void onActivityPaused(android.app.Activity activity);
void onActivityStopped(android.app.Activity activity);
void onActivitySaveInstanceState(android.app.Activity activity, android.os.Bundle bundle);
void onActivityDestroyed(android.app.Activity activity);
}
que necesita para poner en práctica esos métodos y luego registrarse para estos eventos en sus aplicaciones onCreate() de la siguiente manera
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
Esto entonces llamar a la devolución de llamada (el MyApplication objeto) siempre que ocurra un método de ciclo de vida de actividad como onCreate(), onPause, etc. En su onActivityPaused() puede verificar si la aplicación está en segundo plano o no llamando al método @peceps: isApplicationSentToBackground (...)
Esto es lo que mi código es entonces ...
/**
* Application.ActivityLifecycleCallbacks methods
*/
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
try {
boolean foreground = new ForegroundCheckTask().execute(getApplicationContext()).get();
if(!foreground) {
//App is in Background - do what you want
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
crear una nueva clase para ir al primer plano de control (que es un asíncrono. tarea). Ver check android application is in foreground or not? para más.
class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> {
@Override
protected Boolean doInBackground(Context... params) {
final Context context = params[0];
return isAppOnForeground(context);
}
private boolean isAppOnForeground(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null) {
return false;
}
final String packageName = context.getPackageName();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) {
return true;
}
}
return false;
}
}
Creo que un servicio realiza las operaciones a largo plazo y se activa cuando el usuario sale de la aplicación. – Utopia