GCM with custom broadcast transceiver

I am implementing gcm notifications in my application. Since I use my code to generate a large number of applications with different package names, I cannot use the standard name mypackage.GCMIntentService. When creating applications, I only make changes in the manifest and change the import of my class R. Thus, I discouraged my own BroadcastReceiver

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

to return the name GCMIntentService regardless of the package name.

Here is my manifest:

    <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>

Everything works fine, I can register, unregister, receive messages. But when the application is not running, GCMIntentService.onMessage is not called. Am I missing something in my manifest? Why did the system not start the service?

+5
4

/ / GCMIntentService/GCMBroadcastReceiver Android GCM ( Eclipse ADT)

. , GCM . GCM Android-, , . GCM: .


(, = com.example.newpackage),

  • → Android → .
    .
  • AndroidManifest.xml permission uses-permission C2D_MESSAGE:

    <permission android:name="com.example.newpackage.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="com.example.newpackage.permission.C2D_MESSAGE" />
    
  • AndroidManifest.xml category receiver:

    <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>
    

GCMIntentService

com.example.newpackage, GCMIntentService com.example.newpackage.GCMIntentService. ,

  • , extends GCMBroadcastReceiver getGCMIntentServiceClassName():

    public class MyBroadcastReceiver extends GCMBroadcastReceiver
    {
        @Override
        protected String getGCMIntentServiceClassName(Context context)
        {
            return MyIntentService.class.getName(); // Don't hard-code like "com.example.oldpackage.MyIntentService", see http://stackoverflow.com/a/936696/1402846
        }
    }
    

    Google GCMBroadcastReceiver:

    GCMBaseIntentService DEFAULT_INTENT_SERVICE_CLASS_NAME. , getGCMIntentServiceClassName(Context) .

  • AndroidManifest.xml receiver:

    <receiver
        android:name="com.example.oldpackage.MyBroadcastReceiver"
        ... >
    </receiver>
    
  • AndroidManifest.xml service:

    <service android:name="com.example.oldpackage.MyIntentService" />
    

GCMBroadcastReceiver

/ GCMBroadcastReceiver:

  • AndroidManifest.xml receiver:

    <receiver
        android:name="com.example.oldpackage.NewBroadcastReceiver"
        ... >
    </receiver>
    

  • , AndroidManifest.xml 4 :

    • manifest:

      <manifest ...
          package="com.example.newpackage" ...
      
    • permission:

      <permission android:name="com.example.newpackage.permission.C2D_MESSAGE" android:protectionLevel="signature" />
      
    • uses-permission:

      <uses-permission android:name="com.example.newpackage.permission.C2D_MESSAGE" />
      
    • category intent-filter receiver GCM:

      <category android:name="com.example.newpackage" />
      
  • , /.

  • , , ( onRegistered()) .
  • onRegistered(), - LogCat (tag GCMBroadcastReceiver)

    GCMBroadcastReceiver        onReceive: com.google.android.c2dm.intent.REGISTRATION
    GCMBroadcastReceiver        GCM IntentService class: com.example.oldpackage.MyIntentService
    

    , / .

  • getGCMIntentServiceClassName(Context) GCMBroadcastReceiver, - LogCat ( GCMRegistrar):

    GCMRegistrar        Setting the name of retry receiver class to com.example.oldpackage.MyBroadcastReceiver
    

    / .

  • GCM, HTTP- HTTP .
  • :
    • LogCat.
    • /.
    • /.
    • Eclipse.
    • .
    • ADT ( → → Android SDK Manager → ).
    • Eclipse ( → → ).
    • .
    • .
+15

GCMIntentService . org.rferl

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

   <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>
+2

, mypackage.GCMIntentService.

, . - , .


AndroidManifest $PACKAGE_NAME ( ), , package manifest.

package , , :

<manifest package="@string/app_package" ...>
    ...
    <service
        android:name="$PACKAGE_NAME.service.GCMIntentService"
        android:enabled="true" />
    ...
</manifest>

.service - , , , . , , , , .service.

, . Android:

<manifest package="@string/app_package" ...>
    ...
    <service
        android:name=".service.GCMIntentService"
        android:enabled="true" />
    ...
</manifest>

, , .

AndroidManifest ( ), Ant Replace (http://ant.apache.org/manual/Tasks/replace.html) (http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html) Maven.

+2

The broadcast gcm receiver (GCMBroadcastReceiver.class) calls the service class (GCMIntentService.class) from the application root directory. You cannot use "org.rferl.service.GCMIntentService" right now. You must override the getGCMIntentServiceClassName method from GCMBroadcastReceiver, which returns the name of your GCMIntentService class. How to do it here

0
source

All Articles