Android应用关闭/发送到后台时运行代码

Her*_*ter 29 android

我有一个Android应用程序,它将一些数据发送到Web服务.我需要在应用程序关闭或发送到后台后立即发送此数据.但我该如何实现此目的?

我目前的解决方案是在我的家庭活动上的OnPause()上运行它,但无论关闭应用程序时用户所处的活动,我都需要运行它.这是可能的还是我必须将OnPause方法添加到所有活动?

pec*_*eps 25

在您决定使用以下代码之前,首先检查此解决方案/sf/answers/410343391/!


要检查您的应用程序是否已发送到后台,您可以在应用程序的每个活动上onPause()onStop()上面调用此代码:

 /**
   * Checks if the application is being sent in the background (i.e behind
   * another application's Activity).
   * 
   * @param context the context
   * @return <code>true</code> if another application will be above this one.
   */
  public static boolean isApplicationSentToBackground(final Context context) {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasks = am.getRunningTasks(1);
    if (!tasks.isEmpty()) {
      ComponentName topActivity = tasks.get(0).topActivity;
      if (!topActivity.getPackageName().equals(context.getPackageName())) {
        return true;
      }
    }

    return false;
  }
Run Code Online (Sandbox Code Playgroud)

为此,你应该把它包括在你的 AndroidManifest.xml

<uses-permission android:name="android.permission.GET_TASKS" />
Run Code Online (Sandbox Code Playgroud)


Adi*_*mro 22

编辑

此答案仅用于一个目的,即为onPause()所有活动运行代码.当您的应用程序发送到后台时,它不允许您运行代码.

原始答案

创建一个名为的Activity,YourBasicActivity并覆盖其onPause()方法并扩展每个ActivityYourBasicActivity

  • 但是当我们从一个活动切换到另一个活动时,也会调用onPause(),而不仅仅是在应用程序关闭或发送到后台时. (32认同)

RPM*_*RPM 21

这是我使用的方法,它似乎工作得很好:

我有一个自己的顶级Application类,它扩展了Application

public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {
Run Code Online (Sandbox Code Playgroud)

您还需要在清单文件中注册此Application对象:

<application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:name=".MyApplication">
Run Code Online (Sandbox Code Playgroud)

请注意我如何实现ActivityLifeCycleCallbacks接口.该接口具有以下方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

您需要实现这些方法,然后在应用程序onCreate()中注册这些事件,如下所示

@Override
public void onCreate() {
    super.onCreate();
    registerActivityLifecycleCallbacks(this);
}
Run Code Online (Sandbox Code Playgroud)

然后,无论何时发生活动生命周期方法(如onCreate(),onPause等),都会调用回调(MyApplication对象).在onActivityPaused()中,您可以通过调用@peceps方法检查应用程序是否为后台:isApplicationSentToBackground( ...)

这就是我的代码然后......

/**
 * 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) {
}
Run Code Online (Sandbox Code Playgroud)

创建一个新类以进行前台检查(这是一个异步.任务).请参阅检查android应用程序是否在前台?更多.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)