首页 文章

在Google Cloud 消息传递(GCM)中注册和启动服务的两种方法

提问于
浏览
3

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

1.至于为GCM注册Android设备

似乎有两种方法可以将设备注册到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(Context context,String regId)

onUnRegistered(Context context,String regId)

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

...等等 .

虽然描述了“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();
            }
        }
    }
}

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

1 回答

  • 3

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

    只有真正的方法,这是你的第二种方法 . GCMRegistrar 使用第二种方法实现第一种方法 .

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

    只有一种真正的方式,这是你的第二种方法 . GCMBaseIntentService 使用第二种方法来实现第一种方法 - 这就是你需要在清单中注册GCM提供的 BroadcastReceiver 的原因 .

    在其他条件相同的情况下,我建议使用第一种方法,因为它更简单,并为您处理各种问题 . 但是,无论哪种方式都有效

相关问题