应用程序closures时推送通知

你知道是否有可能从应用程序完全closures时收到来自谷歌云消息的通知?

我知道,如果它是开放的或在后台是的,但它可以编程任何方式来接收它们?

编辑:

应用程序closures时,我会继续收到通知。

我附上的代码,以防万一我有一个错误,我不看它。

performance

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.frab" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="com.frab.permission.C2D_MESSAGE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.VIBRATE" /> <permission android:name="com.frab.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.frab.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".GGMBroadcastReceiver" 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="com.something" /> </intent-filter> </receiver> <service android:name=".GCMIntentService" /> </application> </manifest> 

广播接收机

 package com.something; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.util.Log; import com.activities.SignIn; import com.google.android.gcm.GCMBaseIntentService; import com.objects.Globals; public class GCMIntentService extends GCMBaseIntentService { private static final String TAG = "GGM <-----> FRAB"; private Bundle extras; public GCMIntentService() { super(Globals.SENDER_ID); } @Override public void onDestroy() { Log.d(TAG, "terminando servicio"); } @Override protected void onRegistered(Context context, String registrationId) { Log.i(TAG, "onRegistered: registrationId=" + registrationId); } @Override protected void onUnregistered(Context context, String registrationId) { Log.i(TAG, "onUnregistered: registrationId = " + registrationId); } @Override protected void onMessage(Context context, Intent data) { extras = data.getExtras(); String message = extras.getString("msg"); Log.d("******", message); sendNotification(message); } @Override protected void onError(Context arg0, String errorId) { Log.e(TAG, "onError: errorId = " + errorId); } } package com.something; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.support.v4.content.WakefulBroadcastReceiver; public class GGMBroadcastReceiver 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()); // Start the service, keeping the device awake while it is launching. startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); } } 

当应用程序打开: 确定

当应用程序在后台: 好的

当应用程序被用户强制closures时: 通知不会到达

问题是什么?

非常感谢你。

是的,当应用程序完全closures时,可能会收到来自Google云消息的通知。

事实上,广播接收机是GCM用来传递消息的机制。 你需要实现一个BroadcastReceiver并在AndroidManifest.xml中声明它。

请参阅下面的代码片段。

AndroidManifest.xml中

 <receiver android:name=".GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <!-- Receives the actual messages. --> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.google.android.gcm.demo.app" /> </intent-filter> </receiver> <service android:name=".GcmIntentService" /> 

Java代码

 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()); // Start the service, keeping the device awake while it is launching. startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); } } 

当GCM向您的设备发送消息时, BroadcastReceiver将收到该消息并调用onReceive()函数,其中您可以启动一个服务来为您实际执行预期的任务。

上面的代码示例使用了一个叫做WakefulBroadcastReceiver的专门的BroadcastReceiver ,它可以确保设备在进行工作时不会进入睡眠状态。

请参阅相同的官方Android页面: https : //developer.android.com/google/gcm/client.html

当应用程序被用户强制closures时:通知不会到达

这是Android平台的一个特色。 用户强制停止应用程序会使应用程序处于停止状态,并且不会运行任何代码,包括在清单中声明的​​任何广播接收器。 只有当用户显式启动应用程序时,才会处于接收器被触发的状态。

如需进一步阅读: http : //www.doubleencore.com/2014/06/effects-android-application-termination/

它不会在从任务pipe理器中杀死应用程序,但工作,如果你只是从近期滑过。 我试图通过杀死whatsapp,并要求某人发送msg给我,我没有任何通知。 然后,我开始了应用程序,我收到通知。

我刚刚完成了一个GCM应用程序。 如果closures应用程序,它仍然可以运行。 事情是你应该已经打开了一次的应用程序。 创build两个类来实现这个目标: GcmBroadcastReceiverGcnIntentService 。 查找更多信息http://developer.android.com/google/gcm/index.html

这是诀窍

 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()); // Start the service, keeping the device awake while it is launching. startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); } } 

被扩展的类是WakeFulBroadcastReceiver 。 Manifest.xml中有一个WAKE_LOCK权限。 这允许使用WakeLocks保持处理器hibernate或屏幕变暗。 但是,如果您扩展BroadcastReceiver ,则在应用程序closures后将无法工作。

 <uses-permission android:name="android.permission.WAKE_LOCK" /> 

我一直在尝试另一个电话,第二个工作完美,即使电话closures。 第一个有一个房间,不允许在应用程序closures时得到通知…谢谢大家

经过一些testing,我在这个问题上做了一些testing,发现它在closures应用程序方面的performance有所不同。 如果在电缆连接到设备时closures应用程序,则会在应用程序closures时阻止每个通知。 但是,如果将电缆从设备上取下并closures应用程序,则当您发送通知时,所有事情都会再次正常工作!

如果您收到“等待debugging器”popup消息,只需重新启动设备,然后发送testing通知!