因此,当应用程序通过其他地方发现的黑客进入后台时,我们的应用程序正在处理:
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。我希望在广播接收器中有另一个我可以用来处理这个事件的事件,但我还没有找到任何东西。无论如何都要知道你的应用程序是以这种方式进行后台处理的吗?
答案 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处理我的情况转换到另一个活动,如果满足所有这些条件,它必须意味着我正在以某种形式进行背景(适用于我的应用程序切换器和正常背景)。
如果我发现其他任何可以使用改进的内容,或者我错过的案例,我会更新。