【问题标题】:How could I open multiple instances of my Android app如何打开我的 Android 应用程序的多个实例
【发布时间】:2023-03-06 14:31:01
【问题描述】:

我正在构建一个 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);

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

如何检测到这一点以及解决方法以从后台打开任务或启动新任务?

【问题讨论】:

  • 你做不到。你可以打开不同的活动
  • 再一次,Chrome 完全符合我对渐进式网络应用程序快捷方式所做的工作。它是 Google 仅向其应用提供的私有功能吗?

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


【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多