0

Je construis une application Android et l'une de ses fonctionnalités est qu'elle ouvre des sites à l'intérieur et mon application permet à l'utilisateur de créer des icônes pour ces sites, tout comme lorsque vous ajoutez une icône pour un site sur votre bureau avec Chrome. Mais quand vous le faites avec Chrome, pour l'application web progressive, il les ouvre chacun dans une instance du navigateur et je voudrais faire exactement la même chose avec ma propre application.Comment puis-je ouvrir plusieurs instances de mon application Android

Tel est l'objet du raccourci:

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

De cette façon, il ouvre une nouvelle tâche à chaque fois que je clique sur un raccourci, mais ce que je vraiment besoin si cela ouvre une nouvelle tâche que s'il n » t toute tâche exécutant ce site en arrière-plan.

Comment puis-je détecter cela et une solution de contournement pour ouvrir la tâche en arrière-plan ou lancer une nouvelle tâche?

+0

vous ne pouvez pas le faire. vous pouvez ouvrir différentes activités –

+0

Encore une fois, Chrome fait exactement ce que j'essaie de faire avec les raccourcis des applications Web progressistes. S'agit-il d'une fonctionnalité privée que Google fournit uniquement à ses applications? –

Répondre

1

J'ai trouvé une façon de le faire. J'ai créé une activité pour gérer le problème, en regardant les tâches d'arrière-plan et ses intentions de base pour un param dans les extras. Cette activité n'a pas de XML. Il redirige seulement au bon endroit. Voici le code:

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