1

这是我的问题。我正在开发从服务器加载一些文档的应用程序。我通过 Intent.ACTION_VIEW 在另一个应用程序中打开文档。这一切都很好。问题是整个应用程序都受 pin 保护,因此我必须捕获诸如“发送到后台”或“屏幕锁定”之类的事件以在之后调出 pin 屏幕,当在我的上方打开另一个应用程序时,这不起作用。因此,如果用户打开文档然后按主页按钮,从菜单中单击我的启动图标,然后他再次获得打开文档的外部应用程序,并再次使用后退按钮访问我的应用程序。这是需要修复的安全问题。以下是一些代码片段:


打开文件:

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

我的问题是:当打开另一个应用程序时,是否可以检测我的应用程序是否被发送到后台?按下启动器图标时如何不打开另一个应用程序。

感谢所有回复。问候卢博斯

4

1 回答 1

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 上应该有一些答案可以帮助您确定您的应用程序是否在后台(确定这一点实际上并不容易)。

我上面的解释应该回答你的第二个问题。如果您没有在任务中启动其他应用程序,则按下启动器图标时只会启动您的应用程序。

于 2013-02-14T17:59:03.340 回答