这是我的问题。我正在开发从服务器加载一些文档的应用程序。我通过Intent.ACTION_VIEW在另一个应用程序中打开文档。这一切都很好。问题是整个应用程序都受到针脚保护,因此我必须捕获事件,例如“发送到后台”或“屏幕锁定”,以便随后显示针脚屏幕,当我的上方打开另一个应用程序时,这不起作用。因此,如果用户打开文档然后按主页按钮,从菜单中单击我的启动图标,然后他再次获得带有打开文档的外部应用程序,并使用后退按钮再次访问我的应用程序这是需要修复的安全问题。 以下是一些代码段:
打开文件:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(downloadedFile);
String mimeType = document.getMimeType();
intent.setDataAndType(uri, mimeType);
startActivityForResult(intent, 1);
捕获发送到后台:
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
IN_BACKGROUND = true;
Log.i(PinUtil.class.getSimpleName(), "App sent to background ");
} else {
IN_BACKGROUND = false;
}
}
我的问题是:是否可以检测我的应用是否在打开其他应用时发送到后台?当我的启动器图标被按下时,如何不打开另一个应用程序。
感谢所有回复。 问候 Lubos
答案 0 :(得分:1)
为了解决这个问题:
因此,如果用户打开文档,然后按主页按钮,单击我的启动 菜单中的图标然后他再次获取打开文档的外部应用程序 并使用后退按钮再次访问我的应用程序。这是安全问题 需要修复。以下是一些代码段:
当您为用户启动外部应用程序以查看文档时,您需要确保外部应用程序不在与应用程序相同的任务中运行。它需要在一个新的独立任务中运行。你可以这样做:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Ensure app runs in separate task
Uri uri = Uri.fromFile(downloadedFile);
String mimeType = document.getMimeType();
intent.setDataAndType(uri, mimeType);
startActivity(intent); // Can't use startActivityForResult() here
但是,在启动外部查看器时无法使用startActivityForResult()
,因为在其他任务中运行的活动无法向您返回结果。但是,大多数外部应用程序在使用ACTION_VIEW
启动时都不会返回结果,所以它可能不是问题。
然后你问了这个:
我的问题是:是否可以检测我的应用是否被发送到 另一个应用程序打开后的背景?如何不打开另一个应用程序 当我的启动器图标被按下时。
StackOverflow上应该有一些答案可以帮助您确定您的应用程序是否在后台(实际上并不容易确定)。
我上面的解释应该回答你的第二个问题。如果您未在任务中启动其他应用,则只有在您的启动器图标被按下时才会启动您的应用。