7

我正在尝试在 GCM 上注册我的应用程序,但我不知道为什么我的应用程序从未注册过。GCMRegistrar.register(this, SENDER_ID);被调用但我的 GCMIntentService 中的 onRegistered() 从未被调用。我不知道为什么

这是我的 Logcat

01-17 11:03:00.015: D/GCMRegistrar(3509): resetting backoff for com.abc.xyz.ui.activity
01-17 11:03:03.210: V/GCMRegistrar(3509): Registering app com.abc.xyz.ui.activity of senders 964256581311
01-17 11:03:06.070: V/GCMBroadcastReceiver(3509): onReceive: com.google.android.c2dm.intent.REGISTRATION
01-17 11:03:06.070: V/GCMBroadcastReceiver(3509): GCM IntentService class: com.abc.xyz.ui.activity.GCMIntentService
01-17 11:03:06.070: V/GCMBaseIntentService(3509): Acquiring wakelock

这是我完整的清单

    <?xml version="1.0" encoding="utf-8"?>
<manifest package="com.abc.xyz.ui.activity"
    android:versionCode="1"
    android:versionName="1.5.6" xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-sdk 
        android:minSdkVersion="11" android:targetSdkVersion="16"/>
    <uses-feature 
        android:name="android.hardware.usb.host"/>

    <!-- This app has permission to register and receive data message. -->
    <uses-permission
        android:name="com.google.android.c2dm.permission.RECEIVE" />

    <uses-permission 
        android:name="android.permission.INTERNET" />
    <uses-permission 
        android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission 
        android:name="android.permission.GET_TASKS" />
    <uses-permission 
        android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission
        android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission 
        android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission 
        android:name="android.permission.CALL_PHONE" /> 
    <uses-permission 
        android:name="android.permission.BLUETOOTH" />

    <!-- GCM requires a Google account. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />

    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 

    <!--
     Creates a custom permission so only this app can receive its messages.

     NOTE: the permission *must* be called PACKAGE.permission.C2D_MESSAGE,
           where PACKAGE is the application's package name.
    -->
    <uses-permission
        android:name="com.abc.xyz.ui.activity.permission.C2D_MESSAGE" />   
    <permission
        android:name="com.abc.xyz.ui.activity.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />    
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" 
        android:theme="@android:style/Theme.Holo.Light" 
        android:name="com.abc.xyz.MyApplication" 
        android:allowBackup="false">
        <activity
            android:name=".StartupActivity"
            android:noHistory="true"
            android:label="@string/title_startup_screen" 
            android:configChanges="orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".LoginActivity"
            android:windowSoftInputMode="stateAlwaysVisible|adjustResize"
            android:label="@string/title_login_screen"
            android:configChanges="orientation">
        </activity>
        //my other activity defination

        <!--
          BroadcastReceiver that will receive intents from GCM
          services and handle them to the custom IntentService.

          The com.google.android.c2dm.permission.SEND permission is necessary
          so only GCM services can send data messages for the app.
        -->
        <receiver
            android:name="com.google.android.gcm.GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <!-- Receives the actual messages. -->
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <!-- Receives the registration id. -->
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="com.abc.xyz.ui.activity" />
            </intent-filter>
        </receiver>

        <!--
          Application-specific subclass of GCMBaseIntentService that will
          handle received messages.

          By default, it must be named .GCMIntentService, unless the
          application uses a custom BroadcastReceiver that redefines its name.
        -->
        <service android:name="com.abc.xyz.ui.activity.GCMIntentService" />

    </application>
</manifest>

我不知道出了什么问题以及为什么永远不会调用 onRegistered() 。任何帮助将不胜感激。

4

2 回答 2

10

我在另一篇文章中发现了问题所在。我的 GCMIntentService 类在我的清单中定义为

<service android:name="MY_PACKAGE.gcm.GCMIntentService" />

因为我不想把这个类放在根包中,而是放在 MY_PACKAGE.gcm”。这似乎导致了一个问题,正如文档所说,

添加以下意图服务

<service android:name=".GCMIntentService" />

因此,当我移至根包时,它起作用了!还有另一种方法可以将 GCMIntentServiceSubclass 放在您想要的任何位置并以不同的方式命名。您应该继承 GCMBroadcastReceiver 并在清单和子类中进行更改,如this other post所示。

于 2013-04-03T15:16:02.880 回答
2

我回答是因为粘贴代码在注释中几乎不可读:

我从您的 logcat 中遗漏了一些日志,这些日志表明您的服务甚至被调用了。注册时我的 Logcat 中有这个:

GCMBroadcastReceiver  V  onReceive: com.google.android.c2dm.intent.REGISTRATION
GCMBroadcastReceiver  V  GCM IntentService class: com.package.android.app.GCMIntentService
GCMBaseIntentService  V  Acquiring wakelock
GCMBaseIntentService  V  Intent service name: GCMIntentService-DynamicSenderIds-1

特别是最后一行丢失或您忘记粘贴它。你能确保你发布了完整的 LogCat 吗?过滤GCM以确保您没有错过任何内容。

更新

正如评论中提到的OP,他使用该服务做更多事情。这以某种方式干扰了 GCM 功能,并且在将其分成两个服务后它可以工作。经验教训:不要将 GCMIntentService 用于 GCM 以外的任何其他用途。

于 2013-01-18T11:01:47.547 回答