2016-04-20 36 views
1

我有一個應用程序,我正在使用GCM,我只想在應用程序關閉時收到通知,但在前臺沒有收到通知時纔會收到通知。可以在一段時間內禁用GCM服務嗎?

那麼是否有一些功能可以在一段時間內禁用GcmListenerService

+0

我不知道是否有一個具體的GCM的解決方案,但你可以隨時使用'PacakgeManager'和'setComponentEnabledSetting()'。 – CommonsWare

回答

1

你這樣做是錯誤的。實際上,當您的應用收到GCM消息時無關緊要。在你的情況下,它對它做出反應更重要。因此,不是禁用應用程序組件,而是簡單地放置一些邏輯,在某些情況下(比如在前臺)忽略消息,或者在這種情況下處理它們。對我而言,這看起來比完全失聰的應用程序更好。

+0

如果我們不使用資源,是不是不需要使用資源? –

+0

沒有太多的節省 - GCM信息將被傳送到您的設備 - 您將不會選擇它。從我的角度來看,只要丟棄消息(因此所有的邏輯都在我的代碼中),一旦接收者選擇它,比依賴於PackageManager更簡單。 –

0

您必須使用Activity生命週期回調來跟蹤您的應用是否處於前景/後臺。

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

}

您可以使用下面的啓用/禁用接收GCM通知:

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

你在這裏重新發明你的BaseClass,因爲API14有[ActivityLifecycleCallbacks](https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html) –

+0

同意你的意見相應地更新我的答案。 –

相關問題