9

Ich bin auf eine Anforderung gestoßen, aber ich bin nicht in der Lage, den richtigen Weg der Implementierung zu finden und brauche daher Ihre Hilfe.Android App, Aktivitätsstatus (läuft, läuft nicht, Vordergrund/Hintergrund)

Was möchte ich tun? - Ich möchte eine Aktion auszuführen, nach Benachrichtigung abhängig ich wie folgt:

  1. Wenn App geöffnet und im Vordergrund, dh sichtbar Benutzer und ich Benachrichtigung, zeige ich einfach ein Popup meine Aktivität B
  2. zu starten, wenn App ist geschlossen, dh weder im Hintergrund noch im Vordergrund und ich bekomme die Benachrichtigung, ich werde meine Anwendung zuerst starten und dann starten Aktivität B
  3. Wenn die App läuft ABER im Hintergrund dh in recents aber nicht für den Benutzer sichtbar, dann möchte ich starten Meine Aktivität B, ohne die Anwendung neu zu starten. Wenn Benutzer in diesem Fall auf Aktivität B drücken, sollten sie den Bildschirm sehen, den sie verlassen haben, bevor sie in den Hintergrund gesendet werden.

Was habe ich getan? Ich habe Punkt # 1 und # 2 erreicht. Ich möchte Punkt 3 erreichen. Ich habe versucht, die unter

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

Doch diese gibt true zurück, in beiden Fällen Punkt # 2 und # 3, also bin ich nicht in der Lage nur 3 # zu unterscheiden.

Auch habe ich versucht, die unten in jeder Aktivität Ich habe,

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

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

Aber es ist auch nicht das gewünschte Ergebnis Coz geben, wenn die App in den Hintergrund durch Drücken der Home-Taste meine Präferenz wird gesendet isPaused = true und wenn der Benutzer die App aus den letzten entfernt, bleibt sie wahr und ich kann Punkt 2 und 3 nicht mehr unterscheiden, wenn die Benachrichtigung eintrifft.

Entschuldigung für die ganze Geschichte, aber ich hoffe, ich bin in der Lage, meine Anforderung zu erklären.

Vielen Dank im Voraus. :)

Edit:

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

So wie ich in der Lage zu verstehen, müssen Sie die App wechseln, die auf dem Vordergrund stand, wenn der Benutzer 3 'back' Taste auf Aktivität gedrückt? –

+0

Ja, wenn das möglich ist. Idealerweise müsste ich meine App aus dem Hintergrund abrufen und meine Aktivität B darüber starten. –

+0

Zeigen Sie Ihre Manifest-Datei an, ich möchte die Deklarationen von Aktivität A und B sehen. –

Antwort

2

zwischen Fall # 2 und # 3 Fall zu unterscheiden, können Sie folgendes tun:

Einführung ActivityB wenn es nicht Fall # 1 ist. In ActivityB.onCreate() dies tun:

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... 
+1

Danke David, ich habe das nur für jetzt verwendet. :) War auf der Suche nach einer besseren Antwort. Bis ich finde, wird dabei bleiben. –

+0

Was meinst du mit einer "besseren Antwort". Was ist daran falsch? Vielleicht ist Ihre Architektur kaputt, weil Sie versuchen, zwischen all diesen Fällen zu unterscheiden. Was genau versuchen Sie zu erreichen? –

1

Ich weiß, dass u 1 & 2 herausgefunden, aber schlecht Recht, meine eigenen toughts im Falle u tat etwas anderes und u wollen einen Blick nehmen.

  1. Wie Sie wissen, ob Ihre App im Vordergrund ist?

    this sollte der richtige Weg sein, wenn sie im Vordergrund dann ein Ereignis über eventbus posten, EventBus ist meine preffered Art und Weise.

  2. Starten Sie die App bei einer bestimmten Aktivität mit Stapel? werfen Sie einen Blick auf TaskStackBuilder mit diesem answer, es wird Informationen, wie dies richtig zur Verfügung stellen.
  3. App mit einer bestimmten Aktivität fortsetzen, während der aktuelle Stapel beibehalten wird? Überprüfen Sie den Status der App mit den Rückrufen, und öffnen Sie beim Empfang der Benachrichtigung die Aktivität ohne FLAG_ACTIVITY_NEW_TASK. Dies sollte das Tricl machen.
+0

Könnten Sie bitte betonen "Überprüfen Sie den Status der App mit den Rückrufen"? –

+0

Überprüfen Sie bei Aktivitätsrückrufen, ob es aufActivityPaused und nicht aufActivityDestroyd trifft. So können Sie den Status Ihrer App verstehen. – EE66

+0

Okies. Ich werde es versuchen.:) Danke –

1

Wenn Sie keine Popup anzeigen, nur um immer zur Aktivität B (zerstört, Hintergrund oder Vordergrund) zu gehen, brauchen Sie diese Überprüfung nicht. Nur um mit den Flags FLAG_ACTIVITY_X auf Ihrer Benachrichtigung zu arbeiten (es ist GCM diese Benachrichtigung?).

LaunchMode on Manifest

Intent Flags

können Sie die onNewIntent Methode verwenden, um die Absicht zu prüfen, ob aus einer Meldung kommt und starten Activity B.

Notification Proper BackStack

4

Im Folgenden Code funktioniert für mich

In AndroidManifes t.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; 
} 
} 

mit Now myLifecycleHandler Methoden können Sie erhalten alle Bundesländer die Sie benötigen.

isApplicationInForeground bedeutet -> Mindestens eine Aktivität ist im sichtbaren Zustand.

isApplicationVisible Mittel -> Zumindest eine Aktivität ist es, die gestoppt wurde begonnen, aber nicht bedeutet Anwendungszustand

wenn isApplicationInForeground wahr ist, wird isApplicationVisible immer wahr, aber umgekehrt ist nicht läuft wahre

+0

Was ist der Unterschied hier zwischen isApplicationVisible und isApplicationInForeground? –

+0

Ich habe meine Antwort bearbeitet – Akhil