有没有办法处理活动的任务切换器?

时间:2015-08-18 13:47:45

标签: android broadcastreceiver task-switching

因此,当应用程序通过其他地方发现的黑客进入后台时,我们的应用程序正在处理:

 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);
                }
            }
        };

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

enter image description here

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

2 个答案:

答案 0 :(得分:0)

我建议使用onPause()方法。因此,如果您的应用程序进入了“搁浅”状态。调用onPause()方法。就像onCreate()一样,只要您的应用转到后台,您的应用就会运行方法onPause()。您还可以使用BroadcastReceiver检查您的应用通过屏幕关闭或用户发送到后台的方式。如果您想了解有关如何执行此操作的更多信息。评论如下。

答案 1 :(得分: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处理我的情况转换到另一个活动,如果满足所有这些条件,它必须意味着我正在以某种形式进行背景(适用于我的应用程序切换器和正常背景)。

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