2

因此,当应用程序通过在其他地方找到的这个 hack 进入后台时,我们的应用程序正在处理:

 public static boolean isAppGoingToBackground(Context context)
    {
        boolean retVal = false;
        ActivityManager mgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> runningTasks = mgr.getRunningTasks(1);
        if (!runningTasks.isEmpty())
        {
            // If the package name of the current activity doesn't equal the context's
            // package name, then the user is no longer in the context's app.
            ComponentName currentActivity = runningTasks.get(0).topActivity;
            retVal = !currentActivity.getPackageName().equals(context.getPackageName());
        }
        return retVal;
    }

但是,如果通过电源按钮关闭屏幕,这将无法处理,因此我们为该事件添加了一个广播接收器:

_receiver = new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {
                if(intent.getAction() == Intent.ACTION_SCREEN_ON)
                {
                    //resume
                }
                else if(intent.getAction() == Intent.ACTION_SCREEN_OFF)
                {
                    handleAppGoingToBackground(_context);
                }
            }
        };

但是,当用户使用任务切换器使应用程序后台运行时,这些都没有给出正确的响应:

在此处输入图像描述

如果以这种方式后台应用程序,isGoingToBackground 将返回 false。我希望广播接收器中有另一个事件可以用来处理这个事件,但我没有找到任何东西。无论如何,当它以这种方式后台运行时,您的应用程序中有什么要知道的吗?

4

2 回答 2

0

我建议使用该onPause()方法。因此,如果您的应用程序进入“bagrounding”,onPause()则调用该方法。就像您的应用程序在您的应用程序进入后台时onCreate()简单地运行该方法一样。onPause()您还可以使用BroadcastReceiver来检查您的应用程序是如何通过屏幕关机或用户发送到后台的。如果您想了解有关如何执行此操作的更多信息。在下面发表评论。

于 2015-08-18T18:10:53.167 回答
0

好的,所以我得到了一个可行的解决方案,我采用了一些不同的方法来使用 getTasks 调用,因为它已被弃用。这似乎适用于我迄今为止测试过的所有东西,但我会继续测试,看看我是否还有其他问题。基本上我所有的活动都有一个这样定义的超类:

public abstract class BaseActivity extends AppCompatActivity
{
    boolean isStartingActivity = false;
    boolean appWentToBackground = false;
    @Override
    protected void onPostResume()
    {
        super.onPostResume();

        if (appWentToBackground) 
        {
            appWentToBackground = false;
            handleAppComingToForeground();
        }
    }

    @Override
    protected void onStop()
    {
        super.onStop();
        if (!isFinishing() && !isStartingActivity && getChangingConfigurations() == 0)
        {
            appWentToBackground = true;
            //If all of the above is true the app must be going to background
            handleAppGoingToBackground();
        }
        isStartingActivity = false;
    }

    @Override
    public void startActivityForResult(Intent intent, int requestCode, Bundle options)
    {
        isStartingActivity = true;
        super.startActivityForResult(intent, requestCode, options);
    }

    @Override
    public void startActivityFromFragment(Fragment fragment, Intent intent, int requestCode)
    {
        isStartingActivity = true;
        super.startActivityFromFragment(fragment, intent, requestCode);
    }
}

思考过程是ChangingConfigs 检查句柄旋转,isFinishing 句柄被按下(它不处理返回到另一个应用程序中的点,但在我的情况下这种情况是可以的),isStartingActivity 处理我正在过渡到的情况另一个活动,如果满足所有这些条件,它一定意味着我正在以某种形式或另一种形式进行后台处理(适用于应用程序切换器和正常背景)。

如果我发现任何其他可以改进的地方,或者我错过的案例,我会更新。

于 2015-08-18T20:20:00.050 回答