Androids GcmReceiver / GcmListenerService zwingt Anwendung bei Empfang in den Vordergrund

Ich habe ein Problem mit der Implementierung von GCM auf Android, min. SDK 15. Ich kann Push-Benachrichtigungen von GCM problemlos empfangen und meinGcmListenerService Implementierung hat eine funktionierendeonMessageReceived(...) Ruf zurück. Mein Problem ist jedoch, dass immer, wenn der eine oder andere Empfang ausführt, die Anwendung in den Vordergrund gerückt wird!

Mein erwartetes Verhalten ist, dass ich diese Push-Benachrichtigungen sofort empfangen kann, unabhängig davon, ob sich die Anwendung im Hintergrund befindet oder nicht, und dann eine Benachrichtigung in der Taskleiste zu erstellen, die eine Aktivität startet, falls eine Nutzlast dies erfordert.

Der Flow, der ein Problem verursacht, ist (physisches Gerät, Motorola Razr M xt907):

1. Programm starten. Der Geräteschlüssel wird anhand der GCM-Instanz-ID überprüft.
2. Drücken Sie auf Android Home.
3. Drücken Sie die Taste Letzte Apps. wische die Anwendung weg; warte ein paar Sekunden
4. Manuelles Senden einer Push-Benachrichtigung an das Gerät über GCM
5. Die Anwendung erhält die Benachrichtigung und die Anwendung drängt sich zurück in den Vordergrund

Wenn es hilft, habe ich die Hauptanwendung und die Empfänger in separate Prozesse aufgeteilt, um eine Vorstellung davon zu bekommen, was tatsächlich im Hintergrund passiert. Eine abgeschnittene Version davon finden Sie weiter unten:

NotificationsProcess I/MultiDex﹕ VM with version 1.6.0 does not have multidex support
NotificationsProcess I/MultiDex﹕ install
NotificationsProcess I/MultiDex﹕ MultiDexExtractor.load(/data/app/com.MyApp.MyAppmobile.alpha-1.apk, false)
NotificationsProcess I/MultiDex﹕ loading existing secondary dex files
NotificationsProcess I/MultiDex﹕ load found 1 secondary dex files
NotificationsProcess I/MultiDex﹕ install done
...
[... Main Application Code ... ]
...
PrivateProcess I/MultiDex﹕ VM with version 1.6.0 does not have multidex support
PrivateProcess I/MultiDex﹕ install
PrivateProcess I/MultiDex﹕ MultiDexExtractor.load(/data/app/com.MyApp.MyAppmobile.alpha-1.apk, false)
PrivateProcess I/MultiDex﹕ loading existing secondary dex files
PrivateProcess I/MultiDex﹕ load found 1 secondary dex files
PrivateProcess I/MultiDex﹕ install done
NotificationsProcess D/MyApp﹕ Network is connected via WIFI
NotificationsProcess D/MyApp﹕ Executing networkWentOnline() callbacks
NotificationsProcess D/MyApp﹕ Successfully connected to GoogleApiServices for Location Awareness.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GcmListenerService finally comes alive
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NotificationsProcess D/GCMMessageHandler﹕ From: 149994375514
NotificationsProcess D/GCMMessageHandler﹕ Message: null
NotificationsProcess D/GCMMessageHandler﹕ Data: Bundle[{gcm.notification.body=Hey there dude, I like text =), collapse_key=com.MyApp.MyAppmobile.alpha}]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GcmListenerService is finished
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

NotificationsProcess D/MyApp﹕ [... Main Application Code ... ]
NotificationsProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess V/TDCollateJSON﹕ SQLite3 handle is 1417181168
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]

Mein Android-Manifest ist als solches eingerichtet. Die folgenden Elemente befinden sich unter dem Hauptmenü<application> Etikett

<receiver
    android:name="com.google.android.gms.gcm.GcmReceiver"
    android:process="NotificationsProcess"
    android:exported="true"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter
        android:process="NotificationsProcess">
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
    </intent-filter>
</receiver>
<service
    android:name=".GCMMessageHandler"
    android:process="NotificationsProcess"
    android:exported="false">
    <intent-filter
        android:process="NotificationsProcess">
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    </intent-filter>
</service>
<service
    android:name=".GCMInstanceIDListenerService"
    android:process="NotificationsProcess"
    android:exported="false">
    <intent-filter
        android:process="NotificationsProcess">
        <action android:name="com.google.android.gms.iid.InstanceID"/>
    </intent-filter>
</service>
<service
    android:name=".RegistrationIntentService"
    android:process="NotificationsProcess"
    android:exported="false">
</service>

[... Other app activities ...] 

<activity
    android:name=".activities.SyncActivity"
    android:label="@string/app_name"
    android:theme="@style/Theme.AppCompat.NoActionBar"
    android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity> 

Ich habe das ausgeprägte Gefühl, dass dies eine einfache offensichtliche Angelegenheit ist, aber ich wäre nicht überrascht, wenn dies stattdessen eine viel subtilere Angelegenheit wäre. Wenn ich weitere Anwendungsausgaben anbieten kann, lassen Sie es mich bitte wissen!

Jede Erfahrung, Weisheit oder Wege, um dies zu versuchen, werden sehr geschätzt!

BEARBEITEN

Ich beziehe die GcmListenerService-Implementierung mit ein. Beachten Sie, dass ich nur eine Benachrichtigung erstelle und diese poste. MitNei Interaktion vom Benutzer kommt die Anwendung einfach in den Vordergrund - kein Tippen, kein Streichen, nur poof Vordergrund.

@Override
public void onMessageReceived(String from, Bundle data) {

    String message = data.getString("gcm.notification.body");
    Log.d("GCMMessageHandler", "From: " + from);
    Log.d("GCMMessageHandler", "Message: " + message);

    MyApp.WAS_STARTED_FROM_NOTIFICATION = true;

    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle("Hello from MyApp")
                    .setContentText(message);

    NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(MY_APP_NOTIFICATION_ID, mBuilder.build());

}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage