モバイルがスクリーンロックされている場合、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>