我正在尝试在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()。任何帮助将不胜感激。
答案 0 :(得分:10)
我在另一篇文章中想到了什么问题。我的GCMIntentService类在我的清单中定义为
<service android:name="MY_PACKAGE.gcm.GCMIntentService" />
因为我不想把这个类放在root包中,而是把它放在MY_PACKAGE.gcm“。这似乎引起了一个问题,正如文档所说,
添加以下意向服务
<service android:name=".GCMIntentService" />
所以当我转移到root包时它工作了!还有另一种方法可以将GCMIntentServiceSubclass放在任何位置,并以不同的方式命名。您应该将GCMBroadcastReceiver子类化,并在清单和子类中进行更改,如此另一个post所示。
答案 1 :(得分: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以外的任何其他内容。