我有一個應用程序,我正在使用GCM,我只想在應用程序關閉時收到通知,但在前臺沒有收到通知時纔會收到通知。可以在一段時間內禁用GCM服務嗎?
那麼是否有一些功能可以在一段時間內禁用GcmListenerService
?
我有一個應用程序,我正在使用GCM,我只想在應用程序關閉時收到通知,但在前臺沒有收到通知時纔會收到通知。可以在一段時間內禁用GCM服務嗎?
那麼是否有一些功能可以在一段時間內禁用GcmListenerService
?
你這樣做是錯誤的。實際上,當您的應用收到GCM消息時無關緊要。在你的情況下,它對它做出反應更重要。因此,不是禁用應用程序組件,而是簡單地放置一些邏輯,在某些情況下(比如在前臺)忽略消息,或者在這種情況下處理它們。對我而言,這看起來比完全失聰的應用程序更好。
如果我們不使用資源,是不是不需要使用資源? –
沒有太多的節省 - GCM信息將被傳送到您的設備 - 您將不會選擇它。從我的角度來看,只要丟棄消息(因此所有的邏輯都在我的代碼中),一旦接收者選擇它,比依賴於PackageManager更簡單。 –
您必須使用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);
}
}
你在這裏重新發明你的BaseClass,因爲API14有[ActivityLifecycleCallbacks](https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html) –
同意你的意見相應地更新我的答案。 –
我不知道是否有一個具體的GCM的解決方案,但你可以隨時使用'PacakgeManager'和'setComponentEnabledSetting()'。 – CommonsWare