1

我知道这个问题对stackoverflow来说并不新鲜,但是我仍然很困惑。所以请不要将此问题标记为重复,请帮助我!

我的 android 应用程序有很多活动。当我的应用程序进入前台并需要调用另一个 Web 服务时,当我的应用程序切换到后台时,我需要调用 Web 服务。

我的初步发现是:

我的活动:

  protected void onPause() 
    {
        AppUtil.trackAppBackgroundStatus(this);
        super.onPause();
    }

    protected void onResume() 
    {
        super.onResume();
        AppUtil.trackAppForegroundStatus(this);
    }

我的实用程序类:

public class AppUtil 
{
    public static void trackAppForegroundStatus(Context theContext)
    {
        SharedPreferences aSharedSettings = theContext.getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE);
        String aAppStatus = aSharedSettings.getString("appStatus", "");

        if(!aAppStatus.equals("foreground"))
        {       
            SharedPreferences.Editor aPrefEditor = aSharedSettings.edit();
            aPrefEditor.putString("appStatus", "foreground");
            aPrefEditor.commit();

            trackSession(theContext, "foreground");
        }
    }

    public static void trackAppBackgroundStatus(Context theContext)
    {
        SharedPreferences aSharedSettings = theContext.getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE);
        String aAppStatus = aSharedSettings.getString("appStatus", "");

        if(!aAppStatus.equals("background"))
        {   
            SharedPreferences.Editor aPrefEditor = aSharedSettings.edit();
            aPrefEditor.putString("appStatus", "background");
            aPrefEditor.commit();

            trackSession(theContext, "background");
        }
    }
}

trackSession 方法将跟踪我的应用程序的前台和后台状态。

缺点: 如上所述,我的应用程序有各种活动。所以考虑我有 Page_A 和 Page_B。

在 Page_A 中,在 onCreate() 方法调用之后,控制转到 onResume() 并跟踪我的应用程序在前台。当我移动到下一页 (Page_B) 时,调用 Page_A 的 onPause() 方法并跟踪我的应用程序切换到后台。

我不想通过每个活动来跟踪它。我只需要在我的应用程序进入后台时跟踪我的应用程序的后台状态(也就是说,只有当用户按下主页按钮并且我的应用程序切换到后台时)。

任何人都可以请指导我。基本上,我需要调用 2 个网络服务。一是当应用程序进入前台时,二是当应用程序切换到后台时。

如果无法针对应用程序进行这些调用,我该如何更新上面的代码来处理它们。

请提供任何帮助。

4

3 回答 3

0
@Override
protected void onUserLeaveHint() {
    // TODO Auto-generated method stub
    super.onUserLeaveHint();
    // application is on background
}

在 Acitivity.onUserLeaveHint() 的文档中,您可以找到以下内容

当活动由于用户选择而即将进入后台时,作为活动生命周期的一部分调用。例如,当用户按下 Home 键时,会调用 onUserLeaveHint(),但是当有来电导致通话中的 Activity 自动被带到前台时,被中断的 Activity 不会调用 onUserLeaveHint() . 如果调用它,则在活动的 onPause() 回调之前调用此方法。

于 2013-03-12T13:28:07.107 回答
0

如你所说,

  • getRunningTasks() 将解决我的问题。但是,请阅读,Google 可能会拒绝使用 ActivityManager.getRunningTasks() 的应用程序。

但看看文档

            ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
        List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
        for(int i = 0; i < procInfos.size(); i++){
            if(procInfos.get(i).processName.equals("com.your.package.name")) {
//              procInfos.get(i).IMPORTANCE_FOREGROUND 
                Toast.makeText(getApplicationContext(), "your app is running", Toast.LENGTH_LONG).show();
            }
        }
于 2013-03-12T13:49:26.710 回答
0

如果最低 API 级别为 14,那么Application.registerActivityLifecycleCallbacks方法将轻松解决此任务。只需通过增加/减少一些值来计算“onActivityPaused”和“onActivityResumed”方法中的活动活动。所以非零值将表明应用程序处于前台。

于 2014-10-24T08:46:30.010 回答