Android 在谷歌云消息(GCM)中注册和启动服务的两种方式
我正在尝试用GCM开发一个应用程序。我读了关于GCM的官方文件,但感觉有两种方法可以做到这一点 1.至于为GCM注册android设备 似乎有两种方法可以将设备注册到GCM "http://developer.android.com/guide/google/gcm/gs.html#android-应用程序“ 说, 另一方面,, "http://developer.android.com/guide/google/gcm/gcm.html#registering" 说, 2.至于从GCM服务器获取响应并启动服务来处理这些响应 另外,我觉得有两种方法可以启动处理响应的意图 "http://developer.android.com/guide/google/gcm/gs.html#android-“应用程序”指示如下: “创建com.google.android.gcm.GCMBaseIntentService的子类” 实施 onRegistered(上下文,字符串regId) onUnregisted(上下文,字符串regId) onMessage(上下文、意图) ……等等 而http://developer.android.com/guide/google/gcm/gcm.html#registering"用,Android 在谷歌云消息(GCM)中注册和启动服务的两种方式,android,google-cloud-messaging,Android,Google Cloud Messaging,我正在尝试用GCM开发一个应用程序。我读了关于GCM的官方文件,但感觉有两种方法可以做到这一点 1.至于为GCM注册android设备 似乎有两种方法可以将设备注册到GCM "http://developer.android.com/guide/google/gcm/gs.html#android-应用程序“ 说, 另一方面,, "http://developer.android.com/guide/google/gcm/gcm.html#registering" 说, 2.至于从GCM服务器获
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();
}
}
}
}
有两种方法可以完成上述两个过程,并且我可以使用任何一种方法,这对吗
似乎有两种方法可以将设备注册到GCM
只有真正的方法,那就是你的第二种方法GCMRegistar
在封面下使用第二种方法来实施第一种方法
另外,我觉得有两种方法可以启动处理响应的意图
真正的方法只有一种,那就是你的第二种方法GCMBaseIntentService
使用封面下的第二种方法来实现第一种方法——这就是为什么您需要在清单中注册GCM提供的BroadcastReceiver
在其他条件相同的情况下,我推荐第一种方法,因为它更简单,可以为您处理各种问题。不过,两种方法都有效。您好,先生!我也被困在同一个问题上。但就我而言,我有两台设备,摩托罗拉运行安卓2.2版,三星Galaxy S运行2.3版。我使用了第一种方法。这种方法在摩托罗拉设备上运行良好,但在我的三星设备上失败,说“服务不可用”。你能告诉我原因吗?(我的项目指向谷歌API 8,而不是Android SDK 8)。@Shrikant:假设你的三星Galaxy S运行的是原始ROM,我不知道你为什么会出现这样的错误。嗨!我也被困在同一个问题上。但就我而言,我有两台设备,摩托罗拉运行安卓2.2版,三星Galaxy S运行2.3版。我使用了第一种方法。这种方法在摩托罗拉设备上运行良好,但在我的三星设备上失败,说“服务不可用”。你能告诉我原因吗?
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);
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();
}
}
}
}