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;
}
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
Vous avez défini vos deux activités avec launchMode="singleTask"
. C'est la racine de votre problème. Retirez ça.
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.
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);
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.