Xamarin で GCM を使用する Android アプリを作成しています。Xamarin チームのこのガイドと、Google チームのこのガイドに従いました。
Gcm の Xamarin バージョンを実装した後、BroadcaseReceiver.OnReceive で何も受信しませんでした。これがマニフェストとブロードキャストレシーバーです
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          android:installLocation="auto" 
          package="com.pushtest.droid" 
          android:versionCode="1" 
          android:versionName="1">
  <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />
  <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
  <uses-permission android:name="android.permission.GET_ACCOUNTS" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <permission android:name="com.pushtest.droid.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
  <uses-permission android:name="com.pushtest.droid.permission.C2D_MESSAGE" />
  <application android:label="push droid"/>
</manifest>
ブロードキャストレシーバー:
[BroadcastReceiver(Permission = "com.google.android.c2dm.permission.SEND")]
    [IntentFilter(new[] {"com.google.android.c2dm.intent.RECEIVE"}, Categories = new[] {"com.pushtest.droid"})]
    [IntentFilter(new[] {"com.google.android.c2dm.intent.REGISTRATION"}, Categories = new[] {"com.pushtest.droid"})]
    [IntentFilter(new[] {"com.google.android.gcm.intent.RETRY"}, Categories = new[] {"com.pushtest.droid"})]
    public class MyGcmBroadcastReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            System.Diagnostics.Debug.WriteLine("MyGcmBroadcastReceiver.OnReceive");
            if (intent.Action == "com.google.android.c2dm.intent.REGISTRATION")
            {
                var registrationId = intent.GetStringExtra("registration_id");
                var error = intent.GetStringExtra("error");
                var unregistered = intent.GetStringExtra("unregistered");
                System.Diagnostics.Debug.WriteLine("!!!! Registration status |R: {0}|E: {1}|U: {2}", registrationId, error, unregistered);
            }
            else if (intent.Action == "com.google.android.c2dm.intent.RECEIVE")
            {
                System.Diagnostics.Debug.WriteLine("!!!! Push Received: |TBD|");
            }
        }
    }
インテントを開始したとき、何も得られませんでした-エラーもデバッグ情報も結果もありません:
private void RegisterForGcm(Context context)
        {
            const string SenderId = "PROJECT_ID_FROM_GOOGLE_CONSOLE";
            var appExtra = PendingIntent.GetBroadcast(context, 0, new Intent(), 0);
            var intent = new Intent("com.google.android.c2dm.intent.REGISTER");
            intent.PutExtra("app", appExtra);
            intent.PutExtra("sender", SenderId);
            context.StartService(intent);
        }
次に、Googleのガイドが最終的にエラー= "SERVICE_NOT_AVAILABLE"で登録応答を取得したと考えました:
余分な文字列はありませんでした (registration_id はありません)。デバッグ情報: !!!!登録状況 |R: |E: SERVICE_NOT_AVAILABLE|U:
これが私のマニフェストとBroadcastReceiverです(インテントスタートは同じです):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          android:installLocation="auto" 
          package="com.pushtest.droid" 
          android:versionCode="1" 
          android:versionName="1">
  <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />
  <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
  <uses-permission android:name="android.permission.GET_ACCOUNTS" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <permission android:name="com.pushtest.droid.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
  <uses-permission android:name="com.pushtest.droid.permission.C2D_MESSAGE" />
  <application android:label="push droid">
    <receiver android:name="com.pushtest.droid.MyGcmBroadcastReceiver"
              android:permission="com.google.android.c2dm.permission.SEND">
      <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <action android:name="com.google.android.gcm.intent.RETRY" />
        <category android:name="com.pushtest.droid" />
      </intent-filter>
    </receiver>
  </application>
</manifest>
および BroadcastReceiver (属性なし)
 public class MyGcmBroadcastReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            System.Diagnostics.Debug.WriteLine("MyGcmBroadcastReceiver.OnReceive");
            if (intent.Action == "com.google.android.c2dm.intent.REGISTRATION")
            {
                var registrationId = intent.GetStringExtra("registration_id");
                var error = intent.GetStringExtra("error");
                var unregistered = intent.GetStringExtra("unregistered");
                System.Diagnostics.Debug.WriteLine("!!!! Registration status |R: {0}|E: {1}|U: {2}", registrationId, error, unregistered);
            }
            else if (intent.Action == "com.google.android.c2dm.intent.RECEIVE")
            {
                System.Diagnostics.Debug.WriteLine("!!!! Push Received: |TBD|");
            }
        }
    }
ここでのテスト例: https://dl.dropboxusercontent.com/u/19503836/pushtest-issue.zip
Android 2.3.6 デバイスでこのコードを試していました。
ティア!