3

我正在尝试使用 GCM 开发应用程序。我阅读了有关 GCM 的官方文档,但感觉有两种方法可以做到这一点。

1.关于为GCM注册安卓设备

似乎有两种方法可以将设备注册到 GCM。

“http://developer.android.com/guide/google/gcm/gs.html#android-app”说,

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
  GCMRegistrar.register(this, SENDER_ID);
} else {
  Log.v(TAG, "Already registered");
}

另一方面,“http://developer.android.com/guide/google/gcm/gcm.html#registering”说,

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
// sets the app name in the intent
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
registrationIntent.putExtra("sender", senderID);
startService(registrationIntent);

2.关于从GCM服务器获取响应并启动一个服务来处理它们

另外,我觉得有两种方法可以开始处理响应的意图。

“http://developer.android.com/guide/google/gcm/gs.html#android-app”这样的指示,

“创建 com.google.android.gcm.GCMBaseIntentService 的子类”

并实施

onRegistered(上下文上下文,字符串 regId)

onUnRegistered(上下文上下文,字符串 regId)

onMessage(上下文上下文,意图意图)

...ETC。

虽然描述了“http://developer.android.com/guide/google/gcm/gcm.html#registering”,

public class MyBroadcastReceiver extends BroadcastReceiver {                                                                                                                                                                                  
   @Override
   public final void onReceive(Context context, Intent intent) {
       MyIntentService.runIntentInService(context, intent);
       setResult(Activity.RESULT_OK, null, null);
   }   
}   


public class MyIntentService extends IntentService {                                                                                                                          

    private static PowerManager.WakeLock sWakeLock;
    private static final Object LOCK = MyIntentService.class;

    static void runIntentInService(Context context, Intent intent) {
        synchronized(LOCK) {
            if (sWakeLock == null) {
                PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
                sWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "my_wakelock");
            }
        }
        sWakeLock.acquire();
        intent.setClassName(context, MyIntentService.class.getName());
        context.startService(intent);
    }

    @Override
    public final void onHandleIntent(Intent intent) {
        try {
            String action = intent.getAction();
            if (action.equals("com.google.android.c2dm.intent.REGISTRATION")) {
                handleRegistration(intent);
            } else if (action.equals("com.google.android.c2dm.intent.RECEIVE")) {
                handleMessage(intent);
            }
        } finally {
            synchronized(LOCK) {
                sWakeLock.release();
            }
        }
    }
}

是否有两种方法可以完成上述两个过程,并且我可以使用任何我想要的方式?

4

1 回答 1

3

似乎有两种方法可以将设备注册到 GCM。

只有真正的方法,这是你的第二种方法。GCMRegistrar在幕后使用第二种方法来实现第一种方法。

另外,我觉得有两种方法可以开始处理响应的意图。

只有一种真正的方法,那就是你的第二种方法。GCMBaseIntentService在幕后使用第二种方法来实现第一种方法——这就是为什么您需要BroadcastReceiver在清单中注册 GCM 提供的方法。

在其他条件相同的情况下,我推荐第一种方法,因为它更简单并且可以为您处理各种问题。但是,任何一种方式都有效。

于 2012-08-26T11:52:52.613 回答