Android java.lang.RuntimeException:无法实例化service.gcminentService
我正在尝试学习如何使用谷歌云消息系统设置客户端接收器,并遵循以下谷歌教程: 我已经完成了教程要求的所有操作,但当我运行我的应用程序时,它会运行一段时间,然后崩溃,这是LogCat:Android java.lang.RuntimeException:无法实例化service.gcminentService,android,google-cloud-messaging,runtimeexception,Android,Google Cloud Messaging,Runtimeexception,我正在尝试学习如何使用谷歌云消息系统设置客户端接收器,并遵循以下谷歌教程: 我已经完成了教程要求的所有操作,但当我运行我的应用程序时,它会运行一段时间,然后崩溃,这是LogCat: 08-07 17:04:40.726: E/AndroidRuntime(8155): FATAL EXCEPTION: main 08-07 17:04:40.726: E/AndroidRuntime(8155): java.lang.RuntimeException: Unable to instantiate
08-07 17:04:40.726: E/AndroidRuntime(8155): FATAL EXCEPTION: main
08-07 17:04:40.726: E/AndroidRuntime(8155): java.lang.RuntimeException: Unable to instantiate service com.example.google.cloud.messaging.GCMIntentService: java.lang.ClassNotFoundException: com.example.google.cloud.messaging.GCMIntentService in loader dalvik.system.PathClassLoader[/data/app/com.example.google.cloud.messaging-1.apk]
08-07 17:04:40.726: E/AndroidRuntime(8155): at android.app.ActivityThread.handleCreateService(ActivityThread.java:1933)
08-07 17:04:40.726: E/AndroidRuntime(8155): at android.app.ActivityThread.access$2500(ActivityThread.java:117)
08-07 17:04:40.726: E/AndroidRuntime(8155): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:989)
08-07 17:04:40.726: E/AndroidRuntime(8155): at android.os.Handler.dispatchMessage(Handler.java:99)
08-07 17:04:40.726: E/AndroidRuntime(8155): at android.os.Looper.loop(Looper.java:130)
08-07 17:04:40.726: E/AndroidRuntime(8155): at android.app.ActivityThread.main(ActivityThread.java:3687)
08-07 17:04:40.726: E/AndroidRuntime(8155): at java.lang.reflect.Method.invokeNative(Native Method)
08-07 17:04:40.726: E/AndroidRuntime(8155): at java.lang.reflect.Method.invoke(Method.java:507)
08-07 17:04:40.726: E/AndroidRuntime(8155): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
08-07 17:04:40.726: E/AndroidRuntime(8155): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
08-07 17:04:40.726: E/AndroidRuntime(8155): at dalvik.system.NativeStart.main(Native Method)
08-07 17:04:40.726: E/AndroidRuntime(8155): Caused by: java.lang.ClassNotFoundException: com.example.google.cloud.messaging.GCMIntentService in loader dalvik.system.PathClassLoader[/data/app/com.example.google.cloud.messaging-1.apk]
08-07 17:04:40.726: E/AndroidRuntime(8155): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
08-07 17:04:40.726: E/AndroidRuntime(8155): at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
08-07 17:04:40.726: E/AndroidRuntime(8155): at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
08-07 17:04:40.726: E/AndroidRuntime(8155): at android.app.ActivityThread.handleCreateService(ActivityThread.java:1930)
这是我的代码
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, "962129210868");
Log.i("Registrando","");
} else {
Log.i("Test", "Already registered");
}
}
}
这是我的清单
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.google.cloud.messaging"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission
android:name="com.example.google.cloud.messaging.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.google.cloud.messaging.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.example.google.cloud.messaging" />
</intent-filter>
</receiver>
<service android:name="com.example.google.cloud.messaging.GCMIntentService" android:enabled="true"/>
</application>
</manifest>
客户端代码中应该有
gcminentservice
,并且应该在AndroidManifest.xml文件中定义它,如下所示
请注意,如果使用
GCMBroadcastReceiver
,则intent服务的名称应与gcminentservice
完全相同。如果实现广播接收器,则可以创建意图服务 我也有同样的问题。这个问题得到了解决,因为您按照android的要求使用了GCMinentService类名。但是,如果您想重命名这个类或将它放到另一个包中,问题又来了:)这里是解决方案
解决方案:
我们应该创建receiver并将自定义服务的名称设置为重写的方法GetGCMinentServiceClassName
public class GCMReceiver extends GCMBroadcastReceiver {
@Override
protected String getGCMIntentServiceClassName(Context context) {
return "PCAKAGE_NAME.GCMService";
}
}
其中,PCKAGE_NAME是另一个包的名称,如果gcminentservice在另一个包中
别忘了在AndroidManifest.xml中更改接收方名称。在com.example.google.cloud.messaging包中是否有gcminentservice类?aaaaaaaa,这是我错过的。非常感谢。请回答这个问题,这样我可以给你一个+1:),并确保类的路径在清单中解析,如“.package.folder.class”
public class GCMReceiver extends GCMBroadcastReceiver {
@Override
protected String getGCMIntentServiceClassName(Context context) {
return "PCAKAGE_NAME.GCMService";
}
}