【问题标题】:Android check whether app reached background when user pressed Home Button?Android检查用户按下主页按钮时应用程序是否到达后台?
【发布时间】:2013-11-29 11:33:37
【问题描述】:

我是 android 新手,我需要知道每当应用程序从后台恢复时我需要显示密码锁定屏幕应用程序将进入后台并出现锁定屏幕我需要知道应用程序是否在用户按下主页按钮时到达后台

【问题讨论】:

  • 你能贴一些代码吗?
  • 你可以有一个方法来检查除了你的包和相机包之外的任何一个活动是否在上面。如果没有,那就调用锁屏..

标签: android android-intent


【解决方案1】:

将“好”操作列入白名单

我建议您尝试换一种方式考虑。对于您希望用户执行的操作(例如启动相机或从图库中选择),您可以将该操作列入白名单。

这样,如果任何其他原因导致应用进入后台(例如用户接到电话),您可以在他们返回时显示锁定屏幕。

当您启动相机或画廊活动时,您可以定义一个自定义 requestCode,并在它们通过 onActivityResult 返回您的应用程序时检查此内容

类似这样的:

private static final String MIME_TYPE = "image/*";
private static final int MY_GALLERY_REQUEST_CODE = 90210;

private void launchGallery()
{
    Intent i= new Intent();
    i.setType(MIME_TYPE);
    i.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(i, MY_GALLERY_REQUEST_CODE);
}


protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{   
    if (requestCode == MY_GALLERY_REQUEST_CODE) 
    {  
        //user is returning from the gallery picker
    } 
    else  
    {
        showLockScreenIfNeeded();
    }
}

@Override
protected void onResume()
{
    showLockScreenIfNeeded();
}

也来自:另一个 SO 答案:onActivityResult() & onResume()

onActivityResult() 应该在onResume() 之前调用

来自文档:

受保护的 void onActivityResult (int requestCode, int resultCode, 意图数据)

Since: API Level 1 在您启动的活动退出时调用,提供 你启动它的 requestCode,它返回的 resultCode, 以及其中的任何其他数据。结果代码将是 RESULT_CANCELED 如果活动明确返回,则没有 返回任何结果,或在其运行过程中崩溃。 您将收到 当您的活动在 onResume() 之前立即调用 重新开始。

【讨论】:

  • 我认为这是一个好主意,但需要改进 - 按 home 后返回应用不会调用 onActivityResult(但会调用 onResume)
  • 要小心,因为从图库返回时都会调用 onActivityResult 和 onResume,而且根据我的经验,顺序并不总是相同
  • 这是一个很好的观点,我可能会这样做,所以 showMyLockScreen 包含处理其中一些问题的逻辑——更新的答案,再次感谢您的提示。
  • 我认为这是唯一可能的解决方案,它将涵盖大部分@Software Sainath 要求。从后台恢复时,实际上不满足显示锁屏的要求总是:如果应用程序在第三方图库活动中被发送到后台,它将在同一点恢复,而不是在锁定屏幕。但是,我认为实际上不可能处理这种特殊情况。
  • 其实是可以的,见answer
【解决方案2】:

您可以使用以下方法进行检查

@Override
protected void onUserLeaveHint() 
{
   super.onUserLeaveHint();
   // Put your code here
}

【讨论】:

  • 不幸的是,当另一个应用程序被带到我们的应用程序前面时,这将无法处理这种情况(我想,@Software Sainath 的意图是在应用程序进入后台的任何情况下自动注销)。
【解决方案3】:

onResume()(或 onStart())不能用于您的目的,因为只要活动可见,就会调用回调。

您可以覆盖onNewIntent(Intent),然后检查是否在意图内的标志上设置了Intent.FLAG_BROUGHT_TO_FRONT

当您的活动从后台转移到前台时(通常通过按下已运行应用的应用图标),Android 系统会自动设置该标志。当您的活动从另一个活动(例如用于附加图片的相机或画廊)返回时,设置。请注意,为了使用该标志,您应该将活动的启动模式设置为“singleTask”。详情请参考http://developer.android.com/reference/android/R.styleable.html#AndroidManifestActivity_launchMode

【讨论】:

    【解决方案4】:

    不断检查下面的代码,这意味着你可以使用 Timer 类。

    ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        List<RunningTaskInfo> runningTasks = null;
        try {
            runningTasks = activityManager.getRunningTasks(1);
        } catch (Exception e) {
    
        }
        RunningTaskInfo runningTaskInfo = runningTasks.get(0);
        ComponentName topActivity = runningTaskInfo.topActivity;
    if(topActivity.getPackageName().equals(your packagename)){
           S.o.p("fine");}
    else{
           S.o.p.("application sent to background");}
    

    【讨论】:

    【解决方案5】:

    我已经找到解决问题的方法I described 使用@pjco solution

    要使即使从第三方活动进入后台也能显示锁定屏幕,只需在启动这些活动时使用FLAG_ACTIVITY_NO_HISTORY

    Intent intent = new Intent(Intent.ACTION_PICK, Images.Media.INTERNAL_CONTENT_URI);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    startActivityForResult(intent, REQCODE_PICK_GALLERY);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多