我怎么能打开我的Android应用程序的多个实例

时间:2017-06-09 16:51:07

标签: android android-intent android-activity android-manifest intentfilter

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

这是快捷方式的意图:

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

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

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

1 个答案:

答案 0 :(得分:1)

我想办法做到这一点。我创建了一个活动来管理问题,查看后台任务及其基础意图以获得额外的参数。此活动没有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;
    }
}