GCM与自定义广播接收器

pcu*_*pcu 5 android broadcastreceiver google-cloud-messaging

我正在我的应用程序中实现gcm通知.因为我使用我的代码生成大量具有不同包名称的应用程序,所以我无法使用标准的mypackage.GCMIntentService名称.生成应用程序时,我只在Manifest中更改并更改R类的导入.所以我强迫自己的BroadcastReceiver

public class GCMReceiver extends GCMBroadcastReceiver {
  @Override
  protected String getGCMIntentServiceClassName(Context context) {
    return GCMIntentService.class.getName();
  }
}
Run Code Online (Sandbox Code Playgroud)

无论包名称如何,都返回GCMIntentService的名称.

这是我的清单:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <permission
        android:name="org.rferl.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="org.rferl.permission.C2D_MESSAGE" />


    <service
        android:name="org.rferl.service.GCMIntentService"
        android:enabled="true" />


   <receiver
        android:name="org.rferl.GCMReceiver"
        android:enabled="true"
        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="org.rferl" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

一切正常,我可以注册,取消注册,接收消息.但是当应用程序没有运行时,不会调用GCMIntentService.onMessage.我在清单中遗漏了什么吗?为什么系统没有启动服务?

Pan*_*ang 14

为Android GCM 更改application/GCMIntentService/的包/类名GCMBroadcastReceiver(使用Eclipse ADT)

注意:建议您在进行以下更改之前验证是否可以通过GCM接收消息.要使用应用程序的默认程序包名称在Android应用程序中实现GCM ,请参阅GCM:入门.


包裹名字

要更改应用的包名称(例如,新包名称= com.example.newpackage),

  • 在包资源管理器中,右键单击项目→Android工具→重命名应用程序包.
    这会自动方便地更新包名称.
  • AndroidManifest.xml,在更新包名称permissionuses-permissionC2D_MESSAGE:

    <permission android:name="com.example.newpackage.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="com.example.newpackage.permission.C2D_MESSAGE" />
    
    Run Code Online (Sandbox Code Playgroud)
  • AndroidManifest.xml中,更新包名categoryreceiver:

    <receiver
        android:name="com.example.oldpackage.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >  <!-- Not this one!! -->
        <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.newpackage" />  <!-- This one!! -->
        </intent-filter>
    </receiver>
    
    Run Code Online (Sandbox Code Playgroud)

的名字 GCMIntentService

如果您的应用程序包名称是com.example.newpackage,则GCMIntentService必须调用com.example.newpackage.GCMIntentService.如果不,


的名字 GCMBroadcastReceiver

如果您更改了包/类名GCMBroadcastReceiver:


故障排除

  • 验证输入AndroidManifest.xml,包名称应至少出现4次:

  • 如果您更改了软件包名称,请在测试前卸载设备/仿真器上的旧应用程序.

  • 如果您更改了包名,请注意注册ID(您收到的onRegistered())已更改.
  • 如果您收到了注册ID onRegistered(),您应该在LogCat(tag GCMBroadcastReceiver)中看到类似的内容:

    GCMBroadcastReceiver        onReceive: com.google.android.c2dm.intent.REGISTRATION
    GCMBroadcastReceiver        GCM IntentService class: com.example.oldpackage.MyIntentService
    
    Run Code Online (Sandbox Code Playgroud)

    验证目标服务的包/类名是否正确.

  • 如果你getGCMIntentServiceClassName(Context)自己覆盖GCMBroadcastReceiver,你应该在LogCat(tag GCMRegistrar)中看到这样的东西:

    GCMRegistrar        Setting the name of retry receiver class to com.example.oldpackage.MyBroadcastReceiver
    
    Run Code Online (Sandbox Code Playgroud)

    验证广播接收器的包/类名是否正确.

  • 当您的服务器向GCM服务器发送消息时,请检查HTTP状态代码和HTTP响应是否有错误.
  • 如果你绝望了:
    • 检查LogCat是否有错误.
    • 尝试重新启动设备/模拟器.
    • 尝试在设备/模拟器上卸载您的应用.
    • 尝试重新启动Eclipse.
    • 尝试清理并重新构建项目.
    • 尝试更新ADT(下拉菜单→Window→Android SDK Manager→安装包).
    • 尝试更新Eclipse(下拉菜单→帮助→检查更新).
    • 尝试重新启动计算机.
    • 睡个好觉,或祈祷.


Yah*_*r10 2

您应该将 GCMIntentService 类放入您的根应用程序包中。这里是 org.rferl

<service
    android:name=".GCMIntentService"
    android:enabled="true" />
Run Code Online (Sandbox Code Playgroud)

和接收器

   <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.EgoSecure.ma" />
            </intent-filter>
        </receiver>
Run Code Online (Sandbox Code Playgroud)