【发布时间】:2013-11-29 11:33:37
【问题描述】:
我是 android 新手,我需要知道每当应用程序从后台恢复时我需要显示密码锁定屏幕应用程序将进入后台并出现锁定屏幕我需要知道应用程序是否在用户按下主页按钮时到达后台
【问题讨论】:
-
你能贴一些代码吗?
-
你可以有一个方法来检查除了你的包和相机包之外的任何一个活动是否在上面。如果没有,那就调用锁屏..
我是 android 新手,我需要知道每当应用程序从后台恢复时我需要显示密码锁定屏幕应用程序将进入后台并出现锁定屏幕我需要知道应用程序是否在用户按下主页按钮时到达后台
【问题讨论】:
我建议您尝试换一种方式考虑。对于您希望用户执行的操作(例如启动相机或从图库中选择),您可以将该操作列入白名单。
这样,如果任何其他原因导致应用进入后台(例如用户接到电话),您可以在他们返回时显示锁定屏幕。
当您启动相机或画廊活动时,您可以定义一个自定义 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() 之前立即调用 重新开始。
【讨论】:
您可以使用以下方法进行检查
@Override
protected void onUserLeaveHint()
{
super.onUserLeaveHint();
// Put your code here
}
【讨论】:
onResume()(或 onStart())不能用于您的目的,因为只要活动可见,就会调用回调。
您可以覆盖onNewIntent(Intent),然后检查是否在意图内的标志上设置了Intent.FLAG_BROUGHT_TO_FRONT。
当您的活动从后台转移到前台时(通常通过按下已运行应用的应用图标),Android 系统会自动设置该标志。当您的活动从另一个活动(例如用于附加图片的相机或画廊)返回时,不设置。请注意,为了使用该标志,您应该将活动的启动模式设置为“singleTask”。详情请参考http://developer.android.com/reference/android/R.styleable.html#AndroidManifestActivity_launchMode。
【讨论】:
不断检查下面的代码,这意味着你可以使用 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");}
【讨论】:
我已经找到解决问题的方法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);
【讨论】: