如何打开我的 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;
}
}
我正在构建一个 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;
}
}