当应用程序关闭时,GCM 广播接收器未检测到 gcm 通知
Posted
技术标签:
【中文标题】当应用程序关闭时,GCM 广播接收器未检测到 gcm 通知【英文标题】:GCM Broadcast receiver not detcting gcm notification when the app is closed 【发布时间】:2016-05-13 09:37:22 【问题描述】:我有一个广播接收器,它在应用程序打开并在后台检测到即将到来的通知,但是当最近的应用程序被清除时,接收器不工作,请给我建议。
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(),
GcmIntentService.class.getName());
JSONObject json = new JSONObject();
try
json.putOpt("userid", StorePreference.GetSharedPreferenceDetails(context, "memberid"));
json.putOpt("rid",StorePreference.GetSharedPreferenceDetails(context, "partnerid"));
json.putOpt("message", "Received");
BoundService.getInstance().onlinestatus(json);
catch (Exception e)
e.printStackTrace();
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
清单声明:
<receiver
android:name="com.twogether.receivers.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name = "com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.google.android.gcm.demo.app" />
</intent-filter>
</receiver>
【问题讨论】:
发布您的清单。只想检查你如何定义接收者 这是什么版本的 GCM?您应该使用 GcmListenerService 而不是 BroadcastReceiver @krishna 我已经添加了清单 http://***.com/a/24314088/4049612 看看这个例子 @TimCastelijns 我需要在后台检测 gcm 通知... 【参考方案1】:尝试在manifest中注册你的receiver,使用GcmListenerService来接收消息。
google example https://github.com/googlesamples/google-services 有示例可以做到这一点。
<!-- gcm_receiver, this is android source-->
<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.myapp.gcm" />
</intent-filter>
</receiver>
<!-- gcm_listener service -->
<service
android:name="com.qblinks.qmote.GcmListenerService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
// 使用该服务接收消息
public class GcmListenerService extends com.google.android.gms.gcm.GcmListenerService
public void onMessageReceived(String from, Bundle data)
String message = data.getString("message");
Log.v(TAG, "From: " + from);
Log.v(TAG, "Message: " + message);
sendNotification(message);
private void sendNotification(String message)
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification)
.setContentTitle("this is title")
.setStyle(new NotificationCompat.BigTextStyle().bigText(message))//multi line
.setSound(defaultSoundUri); // ring or vibrate if no ring
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(Const.NOTIFICATION_GCM /* ID of notification */, notificationBuilder.build());
【讨论】:
【参考方案2】:当应用关闭时你需要唤醒应用,这意味着你需要有权限这样做
<uses-permission android:name="android.permission.WAKE_LOCK" />
之后可以设置:
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
manager.set(AlarmManager.RTC, System.currentTimeMillis() + 5000, yourIntent);
【讨论】:
以上是关于当应用程序关闭时,GCM 广播接收器未检测到 gcm 通知的主要内容,如果未能解决你的问题,请参考以下文章
在具有两个 GCM 广播接收器的应用中偶尔出现 GCM 错误:INVALID_SENDER