如何打开我的 Android 应用程序的多个实例

How could I open multiple instances of my Android app

我正在构建一个 Android 应用程序,其功能之一是在其中打开网站,我的应用程序允许用户为这些网站创建图标,就像为某些网站添加图标一样使用 Chrome 在您的桌面上创建网站。 但是当您使用 Chrome 执行此操作时,对于渐进式 Web 应用程序,它会在浏览器的一个实例中打开它们,我想对我自己的应用程序执行完全相同的操作。

这是快捷方式的用途:

Intent shortcutIntent = new Intent(context, WebActivity.class);
    shortcutIntent.setAction(Intent.ACTION_MAIN);
    shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName);
    shortcutIntent.putExtra("app_url", appUrl);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

这样,每次我单击快捷方式时它都会打开一个新任务,但如果它仅在后台没有任何任务 运行 那个站点时才打开一个新任务,那才是我真正需要的。

如何检测此问题以及从后台打开任务或启动新任务的解决方法?

我想出了一个办法。我创建了一个 activity 来管理这个问题,查看后台任务及其基本意图以获取额外的参数。这个activity没有XML。它只会重定向到正确的位置。 这是代码:

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;

public class WebAppManagerActivity extends Activity {

    private String appUrl;
    private String appName;
    private String iconUrl;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        appUrl = this.getIntent().getExtras().getString("app_url");
        appName = this.getIntent().getExtras().getString("app_name");
        iconUrl = this.getIntent().getExtras().getString("icon_url");

        ActivityManager.AppTask task = getRunningTask();

        if (task != null) {
            task.moveToFront();
        } else {
            Intent launchActivity = new Intent(getApplicationContext(), WebViewActivity.class);
            launchActivity.setAction(Intent.ACTION_MAIN);
            launchActivity.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName);
            launchActivity.putExtra("app_name", appName);
            launchActivity.putExtra("app_url", appUrl);
            launchActivity.putExtra("icon_url", iconUrl);
            launchActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
            launchActivity.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            WebAppManagerActivity.this.startActivity(launchActivity);
        }

        finish();
    }

    private ActivityManager.AppTask getRunningTask() {

        if(Build.VERSION.SDK_INT < 23) {
            return null;
        }

        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

        for (ActivityManager.AppTask task : manager.getAppTasks()) {
            if (task.getTaskInfo().baseActivity.toString().contains("WebViewActivity") && 
                    appUrl.equals(task.getTaskInfo().baseIntent.getExtras().getString("app_url"))) {

                return task;
            }
        }
        return null;
    }
}