我想在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()永远不会被调用.任何帮助将不胜感激.
解决方法
我回答是因为粘贴代码在评论中几乎无法读取:
我从你的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功能,并在将其分成两个服务之后起作用.经验教训:除了GCM之外,不要将GCMIntentService用于其他任何事情.