2

我已经在我的应用程序中实现了 GCM,但遇到了一个奇怪的问题。IntentService当我的覆盖GCMBaseIntentService位于我的根包中时,它工作正常。我在清单中使用.MyGCMIntentService. 根包将是com.example.rootpackage

当我将意图服务移动到不同的包时,例如com.example.rootpackage.service从未调用过意图服务。在这一点上,我会更新我的清单以指向com.example.rootpackage.service.MyGCMIntentService并且没有骰子。

我是否在 Google 的文档中遗漏了一些关于定位它的内容,或者这就是它的工作原理?

4

1 回答 1

3

是的,它应该在根包中:

此意图服务将由 GCMBroadcastReceiver(由 GCM 库提供)调用,如下一步所示。它必须是 com.google.android.gcm.GCMBaseIntentService 的子类,必须包含公共构造函数,并且应该命名为my_app_package.GCMIntentService(除非您使用覆盖用于命名服务的方法的 GCMBroadcastReceiver 的子类)。

(引自这里

编辑 :

正如文档所说,如果您使用GCMBroadcastReceiver覆盖的子类,则可以更改它getDefaultIntentServiceClassName

public class GCMBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = "GCMBroadcastReceiver";
    private static boolean mReceiverSet = false;

    @Override
    public final void onReceive(Context context, Intent intent) {
        Log.v(TAG, "onReceive: " + intent.getAction());
        // do a one-time check if app is using a custom GCMBroadcastReceiver
        if (!mReceiverSet) {
            mReceiverSet = true;
            String myClass = getClass().getName();
            if (!myClass.equals(GCMBroadcastReceiver.class.getName())) {
                GCMRegistrar.setRetryReceiverClassName(myClass);
            }
        }
        String className = getGCMIntentServiceClassName(context);
        Log.v(TAG, "GCM IntentService class: " + className);
        // Delegates to the application-specific intent service.
        GCMBaseIntentService.runIntentInService(context, intent, className);
        setResult(Activity.RESULT_OK, null /* data */, null /* extra */);
    }

    /**
     * Gets the class name of the intent service that will handle GCM messages.
     */
    protected String getGCMIntentServiceClassName(Context context) {
        return getDefaultIntentServiceClassName(context);
    }

    /**
     * Gets the default class name of the intent service that will handle GCM
     * messages.
     */
    static final String getDefaultIntentServiceClassName(Context context) {
        String className = context.getPackageName() +
                DEFAULT_INTENT_SERVICE_CLASS_NAME;
        return className;
    }
}
于 2013-06-05T23:04:42.260 回答