【问题标题】:Is it possible to disable GCM service for some time?是否可以禁用 GCM 服务一段时间?
【发布时间】:2016-04-20 20:32:33
【问题描述】:

我有一个使用 GCM 的应用程序,我只想在应用程序关闭时接收通知,但在前台不接收通知。

那么有什么功能可以暂时禁用GcmListenerService 吗?

【问题讨论】:

  • 我不知道是否有特定于 GCM 的解决方案,但您始终可以使用 PacakgeManagersetComponentEnabledSetting()
  • @KOrest 你有什么合适的解决方案吗?
  • @manini 不,我按照建议在前台跳过消息的方式进行操作

标签: android google-cloud-messaging gcmlistenerservice


【解决方案1】:

你这样做是错误的。当您的应用程序将收到 GCM 消息时,这无关紧要。在你的情况下,当它对它做出反应时更重要。因此,我没有禁用您的应用程序组件,而是简单地放置一些逻辑,这些逻辑要么在某些条件下忽略消息(比如它在前台),要么在这种情况下以不同的方式处理它们。对我来说,这看起来比让你的应用完全聋更好的方法。

【讨论】:

  • 不使用资源是不是就不用了?
  • 不会节省多少 - GCM 消息将传送到您的设备 - 您只是不会拿起它。从我的角度来看,一旦接收者选择消息,只删除消息(所以所有逻辑都在我的代码中)比依赖 PackageManager 更简单。
【解决方案2】:

您必须使用活动生命周期回调来跟踪您的应用是否处于前台/后台。

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
  • 同意你的观点,我会相应地更新我的答案。
猜你喜欢
  • 2019-09-27
  • 2022-07-06
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多