web-dev-qa-db-fra.com

Reprendre l'activité supérieure au lieu de démarrer l'activité de lancement

J'ai deux activités dans Mon application, l'une étant lanceur et l'autre est lancée comme un appel explicite à partir du premier.

Ici, mon problème est que lorsque je reviens à l'écran d'accueil en appuyant sur la touche d'accueil de la deuxième activité et en lançant l'application, la première activité est à nouveau lancée même si la deuxième activité est déjà en arrière-plan.

La première activité est écrite pour télécharger les actifs requis pour que l'application fonctionne, une fois les actifs téléchargés, elle déclenche la deuxième activité et appelle la fin pour elle-même.

Ci-dessous est mon manifeste de l'application.

<uses-sdk Android:minSdkVersion="7" Android:targetSdkVersion="14" />

<application Android:icon="@drawable/icon" Android:label="@string/app_name" Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen">

    <! Download the Required Assets if not found on SD Card -->
    <activity Android:name=".ContentDownload"
        Android:screenOrientation="landscape"
        Android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|locale" 
        Android:launchMode="singleTask"
        Android:alwaysRetainTaskState="true">

        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <action Android:name="Android.intent.action.SEARCH" />
            <category Android:name="Android.intent.category.DEFAULT" />
        </intent-filter>

    </activity>

    <activity Android:name=".ActualAppActivity" 
        Android:screenOrientation="landscape" 
        Android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|locale" 
        Android:launchMode="singleTask"
        Android:alwaysRetainTaskState="true"
        />

<uses-permission Android:name="Android.permission.INTERNET"/>
<uses-permission Android:name="Android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
<uses-permission Android:name="Android.permission.VIBRATE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission Android:name="Android.permission.CHANGE_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE"/>  

<supports-screens Android:smallScreens="false" Android:normalScreens="true" Android:largeScreens="true" Android:anyDensity="true"/>

Quelqu'un peut-il me guider sur la façon de faire en sorte que la deuxième activité prenne le contrôle directement au lieu de recommencer la première si le lanceur est appelé et qu'il est en arrière-plan.

Voici ma méthode de rappel onResult.

public void onResult(String assetPath, int result)
{
    if(result == RESULT_OK)
    {
        startActivity(new Intent(this, ActualAppActivity.class));
        activity.destroyDownloadActvity();
        finish();
    }
    else
    {
        finish();
        Java.lang.System.exit(0);
    }
    activity.destroyDownloadActvity();
    activity = null;
}
39
Sudhaker

Essayez d'utiliser le code suivant dans la méthode onCreate de l'activité spécifiée en tant qu'activité de lancement dans le manifeste, c'est-à-dire l'activité ContentDownload du code d'origine publié dans la question:

if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
  finish();
  return;
}

Cela terminera votre activité de lancement avant qu'elle ne soit affichée en détectant qu'une tâche est déjà en cours d'exécution, et votre application devrait plutôt reprendre la dernière activité visible.

Voir cette page dans la documentation Android concernant Android Manifest launchModes: http://developer.Android.com/reference/Android/R. styleable.html # AndroidManifestActivity_launchMode

35
Jadent

Vous avez défini vos deux activités avec launchMode="singleTask". C'est la racine de votre problème. Retirez ça.

12
David Wasser

J'utilise le code suivant dans les LAUNCHER Activités de mes applications pour empêcher le redémarrage de l'application lorsqu'elle est toujours vivante en arrière-plan et que l'icône est appuyée

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (!isTaskRoot()) {
        finish();
        return;
    }

    // Rest of your onCreate stuff goes here
}

Cela termine juste l'activité LAUNCHER et reprend la dernière utilisée.

10
Saenic

N'appelez pas finish (). Vous devez passer à l'intention le drapeau FLAG_ACTIVITY_CLEAR_TASK et FLAG_ACTIVITY_NEW_TASK.

Intent intent = new Intent(this, ActualAppActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK| Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
4
Uriel Frankel

Sans voir votre code, je pense que vous voulez quelque chose comme cette réponse:

Android terminer l'activité et en commencer une autre

Vous devez définir intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); et vous devrez également finish() votre activité de lancement aussi bien.

1
themanatuf