2016-04-20 17 views
1

Ich habe eine Anwendung, wo ich GCM verwende und ich möchte Benachrichtigungen nur erhalten, wenn App geschlossen ist, aber wenn es Vordergrund ist, erhalten sie nicht.Kann der GCM-Dienst für einige Zeit deaktiviert werden?

Also gibt es einige Funktionen zum Deaktivieren GcmListenerService für eine Weile?

+0

Ich weiß nicht, ob es eine GCM spezifische Lösung ist, aber man kann immer verwenden 'PacakgeManager' und' setComponentEnabledSetting() '. – CommonsWare

Antwort

1

Sie tun dies falsch. Es spielt keine Rolle, wann Ihre App eine GCM-Nachricht erhält. In Ihrem Fall ist es wichtiger, wenn es darauf reagiert. Anstatt also Ihre Anwendungskomponente zu deaktivieren, würde ich einfach eine Logik verwenden, die Nachrichten unter bestimmten Bedingungen (wie im Vordergrund) ignoriert oder in diesem Fall anders behandelt. Das sieht für mich besser aus als Ihre App völlig taub zu machen.

+0

Ist es nicht unnötig Ressourcen zu nutzen, wenn wir es nicht benutzen? –

+0

Es wird nicht viel von Einsparungen geben - die GCM-Nachricht wird an Ihr Gerät gesendet - Sie werden es einfach nicht abholen. Aus meiner Sicht ist es einfacher, die Nachricht einfach zu löschen (also die ganze Logik ist in meinem Code), sobald der Empfänger es wählt, als auf PackageManager verlassen. –

0

Sie müssen nachverfolgen, ob sich Ihre App im Vordergrund/Hintergrund befindet und Activity Life Cycle Callback verwendet.

public class SampleApplication extends Application 
{ 
    private static int sRunningActivityCount = 0; 

@Override 
public void onCreate() 
{ 
    super.onCreate(); 
    registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks(){ 
     @Override 
     public void onActivityCreated(Activity activity, Bundle savedInstanceState) 
     { 

     } 

     @Override 
     public void onActivityStarted(Activity activity) 
     { 
      sRunningActivityCount++; 
     } 

     @Override 
     public void onActivityResumed(Activity activity) 
     { 

     } 

     @Override 
     public void onActivityPaused(Activity activity) 
     { 

     } 

     @Override 
     public void onActivityStopped(Activity activity) 
     { 
      sRunningActivityCount--; 
     } 

     @Override 
     public void onActivitySaveInstanceState(Activity activity, Bundle outState) 
     { 

     } 

     @Override 
     public void onActivityDestroyed(Activity activity) 
     { 

     } 
    }); 
    } 

public static boolean isAppBackground() 
{ 
    return sRunningActivityCount == 0; 
} 

public static boolean isAppForeground() 
{ 
    return sRunningActivityCount != 0; 
} 

}

können Sie die Verwendung folgenden aktivieren/deaktivieren GCM-Benachrichtigungen empfangen:

public void setNotifications(boolean enabled) 
{ 
    mPackageManager.setComponentEnabledSetting(new ComponentName(mContext, YourGcmListenerService.class), enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED 
      : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 
    Intent intent = new Intent(mContext, YourGcmListenerService.class); 
    if (enabled) 
    { 
     mContext.startService(intent); 
    } 
    else 
    { 
     mContext.stopService(intent); 
    } 
} 
+0

Sie erfinden das Rad mit Ihrer BaseClass hier neu, denn seit API14 gibt es [ActivityLifecycleCallbacks] (https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html) –

+0

Mit Ihnen auf diesem, werden Sie einverstanden sein aktualisiere meine Antwort entsprechend. –