Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在谷歌云消息(GCM)中注册和启动服务的两种方式_Android_Google Cloud Messaging - Fatal编程技术网

Android 在谷歌云消息(GCM)中注册和启动服务的两种方式

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服务器获

我正在尝试用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"用,

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();
            }
        }
    }
}