2015-07-11 14 views
5

Ich habe 3 Hauptklasse in der AnwendungAnwendung abnormales Verhalten Aktivität nicht in der Absicht erwähnt beginnen

1) Intent Service: wo ich Push-Benachrichtigung und offene Aktivität nach Benachrichtigung und die beiden anderen Klassen Verhalten erhalten. unten ist der Code, der tut der

if(Global.isMainScreenRunning){ 
    Intent intent = new Intent(this, MainScreen.class); 
    intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} else if(!Global.NotificationScreenRunning){ 
    Intent intent = new Intent(this, NotificationScreen.class); 
    intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} 

2) NotificationScreen: Dies ist der Mediator Bildschirm so, wenn die Anwendung nicht diesen Bildschirm läuft zuerst angezeigt wird und auf Klick auf Schaltfläche Ja dieses Bildschirms Mainscreen geöffnet und Dieser Bildschirm wird beendet.

3) Hauptbildschirm: Dies ist der Hauptbildschirm der Anwendung, die Karte zeigen. Sein Kernverhalten ist, dass ts ein launchmode="singletask" in Menifest-Datei erwähnt, was bedeutet, wenn dieser Bildschirm läuft seine Loch-Daten werden an onNewIntent() Methode gesendet werden, anstatt diesen Bildschirm wieder zu öffnen.

Nun, was in Fluss geschieht, ist

Schritt 1: Anwendung im Hintergrund ist und Push-Benachrichtigung kommt. Zustand läuft und die zweite Bedingung bekommt Erfolg und Benachrichtigungsbildschirm Absicht

geschossen wird

Schritt 2: Im Benachrichtigungsbildschirm ich auf ihrer Schaltfläche klicken, um den nächsten Hauptbildschirm zu bewegen, auf

Schritt 3: Im Hauptbildschirm ich diesen Prozess Info und Aufgabe ausführen oder einfach die Anwendung schließen

Schritt 4: erneut eine neue Benachrichtigung erhalten und als die Anwendung nicht ausgeführt wird, geht in die zweite Bedingung und starten Sie die Absicht für die Benachrichtigung Bildschirm, aber diesmal kein Benachrichtigungsbildschirm gestartet wird von seiner Absicht und Hauptbildschirm wird gestartet, was falsch ist.

Dies ist das abnormale Verhalten, das ich statt der Bereitstellung von Klasse von Benachrichtigungsbildschirm für Absicht Hauptbildschirm gestartet ist, die völlig anders ist Verhalten der Anwendung nach Android.

Jede Hilfe von jemandem, der auf ein solches Problem stoßen wird sehr geschätzt.

bearbeiten

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.app" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="15" 
     android:targetSdkVersion="18" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 

    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.camera.front" /> 
    <uses-feature android:name="android.hardware.camera.autofocus" /> 
    <uses-feature android:name="android.hardware.microphone" /> 

    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

    <permission android:name="com.example.app.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 
    <uses-permission android:name="com.example.app.permission.C2D_MESSAGE" /> 

    <supports-screens 
     android:largeScreens="true" 
     android:normalScreens="true" 
     android:smallScreens="true" 
     android:xlargeScreens="true" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/android_app_icon" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".SplashScreen" 
      android:configChanges="keyboardHidden|orientation" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <activity 
      android:name=".MainScreen" 
      android:configChanges="keyboardHidden|orientation" 
      android:launchMode="singleTask" 
      android:excludeFromRecents="true" 
      android:screenOrientation="portrait" > 
     </activity> 
     <activity 
      android:name=".NotificationScreen" 
      android:configChanges="keyboardHidden|orientation" 
      android:excludeFromRecents="true" 
      android:screenOrientation="portrait" > 
     </activity> 

     <receiver 
      android:name=".pushnotification.GcmBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <category android:name="com.selebrety.app" /> 
      </intent-filter> 
     </receiver> 

     <service android:name=".pushnotification.GcmIntentService" /> 

     <meta-data android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version" /> 
    </application> 

</manifest> 

Zweite bearbeiten

Das mobile, in dem ich testen bin, ist "YU Yureka" hier link seine Spezifikation ist. Aktuelle es Android 5.0.2 OS

Dritte bearbeiten

Um zu testen, um dieses Verhalten habe ich den Code aus Eclipse Debugger debuggt. Um dies zu überprüfen habe ich einen Breakpoint in NotificationScreenonResume und onCreate gesetzt aber es wurde nie statt onResume von MainScreen getroffen.

Auch ich habe eine Anmeldung hinzugefügt, wenn und sonst Bedingung, aber immer noch Protokolle für sonst Bedingung wird gedruckt.

Vierter bearbeiten Global.isMainScreenRunning: global ist boolean Variable, die in von MainScreen falsch gemacht wird und in onResume von MainScreen wahr gemacht.

Global.NotificationScreenRunning: global ist boolean Variable, die in von NotificationScreen falsch gemacht wird und in onResume von NotificationScreen wahr gemacht.

+0

Wie global ist. isMainScreenRunning deklariert? – TameHog

+0

public static boolean in der globalen Klasse. Dies gilt für onResume und false in onPause. –

+0

Wie haben Sie gezeigt, dass die zweite Bedingung ausgeführt wird? –

Antwort

-1

Hallo @Abhinbav Singh Maurya

Ich denke, das Problem ist, dass Hauptbildschirm von Ihrem Begrüßungsbildschirm im Manifest als Anwendungsstartbildschirm erklärt genannt zu werden, so dass, wenn die App getötet wird und Sie anrufen, um die Absicht Das wird aufgerufen.

Statt dessen können Sie die Nachricht an den Begrüßungsbildschirm senden und im Begrüßungsbildschirm empfangen und je nach Bedingung die Absicht von dort abrufen.

Auch hier gibt es eine Sache, auf die Sie achten sollten, Sie müssen die Absicht nur dann breit übertragen, wenn der Empfänger im SplahScreen registriert ist, sonst wird er nie empfangen. Versuchen Sie also, die Methode user handler.postDelayed nach 1000 ms oder 700 ms zu senden.

Intent mIntent = new Intent(context, SplashScreen.class); 
       mIntent.setAction(Intent.ACTION_MAIN); 
       mIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
       mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       context.startActivity(mIntent); 
broadcastMessage(context, message); 

Ich habe eine ähnliche Frage im folgenden Thread beantwortet. here

Ich denke, das ist, was Sie suchen. Bitte lassen Sie mich wissen, ob dies Ihre Anforderung erfüllt oder nicht, wenn Sie die Antwort nützlich finden, wenn meine Antwort Ihnen hilft, stimmen Sie die Antwort ab, damit sie für andere nützlich ist.

Prost :)

bearbeiten

Ich habe tat auf sie ein wenig Forschung.

Sie können zwei Launcher-Aktivitäten gemäß this Link haben.

Versuchen Sie es und lassen Sie es mich wissen. Hoffe das hilft dir. :)

+0

Bitte überprüfen Sie meine Frage korrekt Ich habe nicht erwähnt, Hauptscreen als Startbildschirm Ich habe seinen Startmodus als Einzelaufgabe erklärt. Es gibt viele Unterschiede zwischen ihnen. –

+0

können Sie Ihr Manifest hier veröffentlichen. In Ihrer Frage haben Sie erwähnt, dass der Hauptbildschirm der Hauptbildschirm der Anwendung ist. Was ist also der Grund, die Antwort zu verwerfen? –

+0

Jetzt, wenn die Anwendung nicht ausgeführt wird und Sie versuchen, Absicht aufzurufen, wird Ihr "SplashScreen" nach meinem Wissen geladen. Offensichtlich wird Ihr Startbildschirm starten und Ihren 'MainScreen' laden. Sie müssen also den Intent-Dienst vom Intent-Dienst ausstrahlen und ihn im Begrüßungsbildschirm empfangen und die nächste Aktion entsprechend ausführen. Das hat meine Antwort gesagt. Ich nahm an, dass Ihr MainScreen Ihr Startbildschirm ist, also versuchen Sie es bitte und lassen Sie es mich wissen. –

0

Der globale Staat ist böse, und diese Frage zeigt, warum. Um zu verstehen, was passiert, müssen Sie sich jeden Ort ansehen, an dem Ihre globalen Flags gesetzt oder gelöscht werden, und alle möglichen Ausführungspfade analysieren, die dorthin führen könnten. Das ist weit mehr als die Art von Hilfe, die man bei SO bekommen kann. Und es gibt eine zusätzliche Komplikation für Android, da die gesamte VM möglicherweise zerstört wird (und alle Ihre Globals gelöscht werden), wenn sich Ihre App im Hintergrund befindet. Genauso schlimm kann es sein, dass die VM und die Application Instanz nach dem Beenden der letzten Aktivität beibehalten werden. Wenn das passiert, wird Application#onCreate(...) nicht erneut beim nächsten Start der App aufgerufen und alle Ihre static Globals werden immer noch auf das festgelegt, was sie waren, als Sie die App zuletzt ausgeführt haben.

Sparen Sie sich viel Haarziehen und hören Sie auf, den globalen Zustand zu verwenden.

+0

Ich glaube, Sie haben die Frage nicht richtig gelesen. Bitte lesen Sie die Frage und lassen Sie mich die Antwort wissen. Und übrigens ist das Problem nicht mit der globalen Variable seine mit der Absicht nicht richtig beginnen Aktivität –

+1

@AbhinavSinghMaurya glauben, dass Sie die Antwort nicht richtig gelesen haben. Ihre Frage ist * nicht zu beantworten * ohne eine Analyse jedes Lese- oder Schreibvorgangs von 'Global.isMainScreenRunning' und' Global.NotificationScreenRunning' in Ihrer gesamten App. –

-2
if(Global.isMainScreenRunning){ 
    Intent intent = new Intent(this, MainScreen.class); 
    intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(Intent);//here is the problem change Intent to intent 

} else if(!Global.NotificationScreenRunning){ 
    Intent intent = new Intent(this, NotificationScreen.class); 
    intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} 
+0

Das ist nicht mein Problem. Bitte lesen Sie die Frage sorgfältig und folgen Sie den Schritten, die ich dort erwähnt habe –

+0

Ich denke, Sie möchten sagen, dass das erste Mal App normal funktioniert, aber wenn App seinen ersten Zyklus beendet, verhält es sich abnormal –

+0

Genau. Wie wenn Sie eine offene App in Eclipse ohne jede Änderung ausführen sagt seine vorherige Aufgabe ist, bringen Sie diese Art von Verhalten Ich fühle mich mit der App –

0

Sie können android:taskAffinity=":main" zu Ihrer MainScreen-Aktivität in Manifest hinzufügen.
Vielleicht, weil der MainScreen immer noch in einer gleichen Task mit dem NotificationScreen, so war es alle Aufgabe, wenn NotificationScreen erneut aufgerufen.
Sie können diese Demo versuchen, für mehr visuelle: play app und code
Hoffe, es hilft.

0

Wie ich Ihren Punkt bekommen Sie wollen Benachrichtigungsbildschirm jedes Mal wieder, wenn Sie Benachrichtigung in der App erhalten.Für dies kann ich vorschlagen, eine Lösung, damit die Anwendung ausgeführt wird und ermöglicht Ihnen, das erwartete Verhalten zu erreichen, aber wenn Sie nach Hause drücken Knopf, Ihr Hauptbildschirm wird nicht mehr aktiv.Es wird getötet.Wie wir alle wissen, Android behält Aktivität Stacks für alle Aktivitäten.So, wenn Sie Gerät zurück drücken, dann wird Aktivität aus dem Stapel herausgesprungen und Sie werden dieses Problem nicht konfrontiert werden.

Ich denke, dies ist ein Standardverhalten von Aktivität Stacks für weitere Informationen, die Sie mit diesem Link gehen:

http://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack

Sie können diesen Code-Schnipsel versuchen:

Intent i = new Intent(NotificationFullScreen.this, 
     MainActivity.class); 
    i.putExtra("FROM", "Notification"); 
    i.putExtra("bookingId", bookingId); 
    i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY 
     | Intent.FLAG_FROM_BACKGROUND); 
    startActivity(i); 
    NotificationFullScreen.this.finish(); 
+0

was eine Präsentation von Ran Nachmany gemacht. Ich kannte das in der Präsentation erwähnte Verhalten nicht, und die Seiten 91-101 erklären das genaue Verhalten, das ich mit Intent.FLAG_ACTIVITY_NEW_TASK konfrontiere. Danke für die Antwort. Ich habe das Problem mit den erwähnten Flaggen gelöst. aber ja, mein MainScreen wird getötet, nachdem ich mich von ihm entfernt habe, aber was kann mit dem Standardverhalten getan werden. Deine Antwort hat mein Problem behoben. –

Verwandte Themen