0

モバイルがスクリーンロックされている場合、GCMBroadcast レシーバーはメッセージを GCMIntentService に送信しません。解決策は、放送受信機の onReceive メソッドに wakelock.acquire() と wakelock.release() のトリックを実装することだと読みました。しかし、GCMBroadcastReceiver には最終的に onReceive があるため、この機能を追加することはできません。

解決策はありますか?

[編集]

間違った質問です。5 時間の調査の後、すべて解決しました。

明確にするために:

  • GCMBroadcast にはウェイクロックの取得と解放があり、実装は必要ありません。
  • 私の問題は、SERVER CODE で DELAY WHEN IDLE プロパティが true に設定されていることが原因でした。

    builder = builder.delayWhileIdle(true);
    

公式ドキュメントから:

デバイスが接続されているがアイドル状態の場合、delay_while_idle フラグが true に設定されていない限り、メッセージはすぐに配信されます。それ以外の場合は、デバイスが起動するまで GCM サーバーに保存されます。

[/編集]

ここに私のコード: GCMIntentService

public class GCMIntentService extends GCMBaseIntentService{

public GCMIntentService() {
    super(CommonStuff.SENDERID);
    // TODO Auto-generated constructor stub
}


@Override
protected void onError(Context arg0, String arg1) {
    // TODO Auto-generated method stub
    System.out.println("onError:"+arg1);
}

@Override
protected void onMessage(Context context, Intent intent) {

    Log.i("GCMIntentService", "Message Received");

    Bundle extras = intent.getExtras();

    // Extract the payload from the message

    if (extras != null) {


        String type=(String)extras.get("type");
        String msg=(String)extras.get("message");
        //do something........

    }

}

@Override
protected void onRegistered(Context ctx, String regId) {
    Log.d("GCMIntentService","REGID_ARRIVED:"+regId);
    try {
        //do something
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

}

@Override
protected void onUnregistered(Context arg0, String arg1) {
    // TODO Auto-generated method stub
    System.out.println("onUnregistered:"+arg1);

}

}

ウェイクロッカー

public abstract class WakeLocker {
private static PowerManager.WakeLock wakeLock;

public static void acquire(Context ctx) {
    if (wakeLock != null) wakeLock.release();

    PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
            PowerManager.ACQUIRE_CAUSES_WAKEUP |
            PowerManager.ON_AFTER_RELEASE, MainActivity.APP_TAG);
    wakeLock.acquire();
}

public static void release() {
    if (wakeLock != null) wakeLock.release(); wakeLock = null;
}
}

MANIFEST の私の GCMreceiver

<receiver
            android:name="com.google.android.gcm.GCMBroadcastReceiver"
            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" />

                <category android:name="my.app.package" />
            </intent-filter>
        </receiver>
4

1 に答える 1

0

解決済みとして設定するだけで、質問の編集部分の解決策。

于 2012-10-25T06:33:00.687 に答える