Application Android, état d'activité (en cours d'exécution, pas en cours d'exécution, avant-plan / arrière-plan)

J'ai rencontré une exigence, mais je ne suis pas en mesure d'obtenir le bon moyen de mise en œuvre et donc d'avoir besoin de votre aide.

Ce que je veux faire? – Je souhaite effectuer une action en fonction de la notification que je reçois comme suit:

  1. Lorsque l'application est ouverte et au premier plan, c'est-à-dire visible pour l'utilisateur et je reçois une notification, je montre simplement une fenêtre contextuelle pour démarrer mon activité B
  2. Lorsque l'application est fermée, c'est-à-dire ni en arrière-plan, ni au premier plan, et je reçois la notification, je commencerai d'abord ma demande, puis commencer l'activité B
  3. Lorsque l'application est en cours d'exécution, MAIS en arrière-plan, c'est-à-dire en retrait mais pas visible pour l'utilisateur, je souhaite commencer mon activité B sans redémarrer l'application. En outre, dans ce cas, lorsque l'utilisateur appuie sur l'activité B, ils devraient voir l'écran qu'ils ont laissé avant de l'envoyer à l'arrière-plan.

Ce que j'ai fait? J'ai atteint les points n ° 1 et n ° 2. Je veux atteindre le point n ° 3. J'ai essayé ci-dessous

public static boolean isApplicationBroughtToBackground(final Activity activity) { ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(1); // Check the top Activity against the list of Activities contained in the Application's package. if (!tasks.isEmpty()) { ComponentName topActivity = tasks.get(0).topActivity; try { PackageInfo pi = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_ACTIVITIES); for (ActivityInfo activityInfo : pi.activities) { if(topActivity.getClassName().equals(activityInfo.name)) { return false; } } } catch( PackageManager.NameNotFoundException e) { return false; // Never happens. } } return true; } 

Cependant, cela retourne vrai dans les deux cas, le point n ° 2 et le n ° 3, donc je ne peux pas distinguer que le n ° 3.

J'ai également essayé ci-dessous dans toutes les activités que j'ai,

 @Override protected void onPause() { super.onPause(); saveIsPausedInPref(true); } @Override protected void onResume() { super.onResume(); saveIsPausedInPref(false); } 

Mais, il ne donne pas non plus le résultat souhaité, si l'application est envoyée à l'arrière-plan en appuyant sur le bouton Accueil, ma préférence aura isPaused = true et si l'utilisateur supprime l'application de la dernière, elle restera vrai et encore une fois je ne le ferai pas Être en mesure de différencier les points n ° 2 et n ° 3 lorsque la notification arrive.

Excuses pour toute l'histoire, mais j'espère pouvoir expliquer mon besoin.

Merci d'avance. 🙂

Modifier:

  <activity android:name=".HomeActivity" android:screenOrientation="portrait" > </activity> <activity android:name=".ChatProfileActivity" android:screenOrientation="portrait" > </activity> 

  • ActivityLifecycleCallbacks ne sont pas déclenchés lorsque l'activité est tuée par "Ne pas garder les activités"
  • Cycle de vie de l'activité Android après avoir appuyé sur le bouton Retour
  • L'activité onStop () n'est pas appelée lorsque le bouton d'accueil est pressé en mode multi-fenêtre Android N
  • Android débutant: onDestroy
  • Existe-t-il une fonction dans Android analogue à "int main" en C / C ++ qui contient la boucle principale du programme?
  • Videoview Pause et reprise
  • Qu'est-ce que la méthode exactement Activity.finish () fait?
  • Méthode à ignorer lorsque la mise en page est détruite dans Android
  • 4 Solutions collect form web for “Application Android, état d'activité (en cours d'exécution, pas en cours d'exécution, avant-plan / arrière-plan)”

    Pour différencier le cas n ° 2 et le cas n ° 3, vous pouvez faire ce qui suit:

    Lancez ActivityB si ce n'est pas le cas n ° 1. Dans ActivityB.onCreate() procédez comme suit:

     super.onCreate(...); if (isTaskRoot()) { // ActivityB has been started when the app is not running, // start the app from the beginning Intent restartIntent = new Intent(this, MyRootActivity.class); startActivity(restartIntent); finish(); return; } ... rest of onCreate() code here... 

    Le code ci-dessous fonctionne pour moi

    Dans AndroidManifest.xml

     <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:name=".MyApplication" > 

    MyApplication.java

     public class MyApplication extends Application { private ActivityLifecycleCallbacks myLifecycleHandler; @Override public void onCreate() { super.onCreate(); myLifecycleHandler=new MyLifecycleHandler(); registerActivityLifecycleCallbacks(myLifecycleHandler); } } 

    MyLifecycleHandler.java

     public class MyLifecycleHandler implements Application.ActivityLifecycleCallbacks { private static final String TAG = MyLifecycleHandler.class.getSimpleName(); private static int resumed; private static int paused; private static int started; private static int stopped; @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityDestroyed(Activity activity) { } @Override public void onActivityResumed(Activity activity) { ++resumed; } @Override public void onActivityPaused(Activity activity) { ++paused; Log.d(TAG, "application is in foreground: " + (resumed > paused)); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityStarted(Activity activity) { ++started; } @Override public void onActivityStopped(Activity activity) { ++stopped; Log.d(TAG, "application is visible: " + (started > stopped)); } public static boolean isApplicationVisible() { return started > stopped; } public static boolean isApplicationInForeground() { return resumed > paused; } } 

    En utilisant les méthodes myLifecycleHandler , vous pouvez obtenir tous les états dont vous avez besoin.

    IsApplicationInForeground signifie -> Au moins une activité est visible.

    IsApplicationVisible signifie -> Au moins une activité est là qui a commencé mais pas arrêté, signifie que l'application est en cours d'exécution

    Si isApplicationInForeground est vrai isApplicationVisible sera toujours vrai, mais vice versa n'est pas vrai

    Je sais que vous avez compris 1 et 2, mais j'ai raison de mes propres contraintes au cas où vous auriez fait autre chose et que vous voulez regarder.

    1. Comment savoir si votre application est au premier plan?

      Ce devrait être le bon moyen, s'il est au premier plan puis publier un événement via le bus événementiel, le bus événementiel est mes préférences.

    2. Démarrer l'application dans une activité spécifique avec pile? Jetez un oeil à TaskStackBuilder avec cette réponse , il fournira des informations à ce sujet correctement.
    3. Reprenez l'application avec une certaine activité tout en conservant la pile actuelle? Vérifiez l'état de l'application avec les rappels, puis, lors de la réception de la notification, ouvrez l'activité sans FLAG_ACTIVITY_NEW_TASK. Cela devrait faire le tricl.

    Si vous changez pour ne pas afficher de pop-up, il suffit de passer à l'Activité B toujours (détruit, en arrière-plan ou au premier plan), vous n'avez besoin d'aucun de ces contrôles. Juste pour travailler avec les drapeaux FLAG_ACTIVITY_X sur votre notification (c'est GCM cette notification?).

    LancerMode on Manifest

    Drapeaux d'intention

    Vous pouvez utiliser la méthode onNewIntent pour vérifier l'intention si elle provient d'une notification et commencer l'activité B.

    Notification Proper BackStack

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.