当应用程序未运行时,GCM 推送通知未在某些设备中显示
Posted
技术标签:
【中文标题】当应用程序未运行时,GCM 推送通知未在某些设备中显示【英文标题】:GCM push notification is not showing in some devices when app is not running 【发布时间】:2016-02-15 05:49:56 【问题描述】:我在我的应用程序中实现 GCM 推送通知并成功完成,但在某些设备中,当应用程序关闭时它不显示通知。
未显示通知的设备列表:
红米-2
联想
金立
谁能解释一下什么是问题以及我如何解决它。
这是我的清单:-
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="student.skoolstar.android.catalyst.com.schoolstar.skoolstarstudent">
<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" />
<permission
android:name="student.skoolstar.android.catalyst.com.schoolstar.skoolstarstudent.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="student.skoolstar.android.catalyst.com.schoolstar.skoolstarstudent.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:name="student.skoolstar.android.catalyst.com.schoolstar.skoolstarstudent.Controller"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/MyMaterialTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Login"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
</activity>
<activity
android:name=".ListOfClass"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".EditProfile"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
</activity>
<activity
android:name=".ShowStudentList"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
</activity>
<receiver
android:name="student.skoolstar.android.catalyst.com.schoolstar.skoolstarstudent.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="schoolstar.com.catalyst.android.skoolstar" />
</intent-filter>
</receiver>
<service android:name=".GCMNotificationIntentService" />
<activity
android:name=".Message"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
</activity>
<activity
android:name=".Attendance"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
</activity>
<activity
android:name=".NewMessage"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
</activity>
<activity
android:name=".GroupMessage"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
</activity>
<activity
android:name=".Test_Chat"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
</activity>
</application>
</manifest>
这里是我的服务名称 GCMNotificationIntentService:-
public class GCMNotificationIntentService extends GCMBaseIntentService
public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
Database db;
private Controller aController = null;
public GCMNotificationIntentService()
// Call extended class Constructor GCMBaseIntentService
super(Constants.GOOGLE_SENDER_ID);
public static final String TAG = "GCMNotificationIntentService";
@Override
protected void onRegistered(Context context, String registrationId)
@Override
protected void onUnregistered(Context context, String registrationId)
Log.d("unref",registrationId);
if(aController == null)
aController = (Controller) getApplicationContext();
Toast.makeText(getApplicationContext(),"hello no",Toast.LENGTH_LONG).show();
aController.displayMessageOnScreen(context,
getString(R.string.gcm_unregistered));
aController.unregister(context, registrationId);
@Override
public void onError(Context context, String errorId)
Log.d("error","");
if(aController == null)
aController = (Controller) getApplicationContext();
aController.displayMessageOnScreen(context,
getString(R.string.gcm_error, errorId));
@Override
protected void onMessage(Context context, Intent intent)
if(aController == null)
aController = (Controller) getApplicationContext();
aController.acquireWakeLock(getApplicationContext());
String message = intent.getExtras().getString("message");
String formuser = intent.getExtras().getString("formuser");
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+5:30"));
Date currentLocalTime = cal.getTime();
DateFormat date = new SimpleDateFormat("HH:mm a");
date.setTimeZone(TimeZone.getTimeZone("GMT+5:30"));
String localTime = date.format(currentLocalTime);
db = new Database(context);
int from_id = 0;
List<FetchData> fetchdata = db.getAllContacts();
for (FetchData fd : fetchdata)
from_id=fd.getID();//get ser no
db.storeMessage(420, formuser, from_id + "", message, "text", localTime, "F", "ST", "R");
aController.displayMessageOnScreen(context, message);
// notifies user
sendNotification(context,message);
private void sendNotification(Context context,String msg)
String app_name = context.getResources().getString(R.string.app_name);
mNotificationManager = (NotificationManager) this
.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, ListOfClass.class), 0);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
this).setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(app_name)
.setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
.setContentText("New Message")
.setSound(alarmSound);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
wl.acquire(15000);
// Log.d(TAG, "Notification sent successfully.");
当我看到 whatsapp、hiking 和其他通知应用程序时,他将始终在后台线程中运行,但我的应用程序并不总是在后台运行。也可能是这个原因。 我最近正在研究android,请帮助我。提前致谢!
【问题讨论】:
您可以尝试使用 WakefulBroadcastReceiver 的 gcm 新实现,我们在其中启动 Intent 服务? 您尝试使用Instance ID api进行GCM注册吗? 【参考方案1】:我在使用 Redmi-2 时遇到了类似的问题。代码没有问题,但这是由于制造商提供的自定义 UI,如 MIUI 6。 所以要启用 GCM 通知
转到安全应用>>点击权限>>点击自动启动并为您的应用启用自动启动。
【讨论】:
我可以像 whatsapp、hike 和其他应用程序这样以编程方式进行吗?【参考方案2】:有两个主要原因
1 - 某些设备不允许您在后台运行服务,例如 redmi-2(几乎在所有小米设备上)。除非用户通过转到安全应用程序>>点击权限>>点击自动启动并为whatsapp等启用自动启动,否则即使whats应用程序也无法在它们上正常运行。在这种情况下,您所能做的就是显示详细信息这在应用程序启动时给用户。并打开该屏幕并引导用户(如果可能的话)像干净的主人。
2- 第二个原因是它无法在其中一部未正确安装 Google Play 服务应用程序的手机上运行(这对于 GCM 至关重要)。你也不能在这些设备上做任何事情。在这种情况下,您唯一能做的就是向用户显示一些关于此的消息。
所以根据我的经验,总会有一些用户(但比例很小)不会收到 GCM 推送。
【讨论】:
如何找到需要在哪部手机上做自动开机码?表示我知道在 MI 设备中 需要自动启动但不知道其他人。【参考方案3】:小米手机有白名单的概念。因此,如果您在 gcm 的 onReceive 中输入登录信息,您会注意到 gcm 正在接收,但没有进一步处理。其原因是您的应用未列入白名单。
为了安全起见,小米禁用了每个应用程序的通知。一旦他们使用清洁器退出应用程序,请按照以下步骤在后台接收消息。
启用自动启动 启用浮动和锁定屏幕通知启用自动启动
打开安全应用程序。 进入权限,然后点击自动启动管理。 添加/启用自动启动应用程序(例如 Whatsapp)。启用浮动和锁定屏幕通知
打开设置应用。 点击通知,然后点击管理通知。 点击您要查找的应用程序(例如 WhatsApp)。 启用在通知栏显示/在锁屏和下拉选项中显示。参考请查看:http://support.hike.in/entries/55998480-I-m-not-getting-notification-on-my-Xiaomi-Phone-For-MIUI-6-
我在这方面取得了成功..希望它有所帮助..
【讨论】:
如何找到需要在哪部手机上做自动开机码?表示我知道 MI 设备 需要自动启动但不知道其他人。 @bdevloper 你知道哪个设备有自动启动选项吗?因为某些库存的安卓设备没有这个选项?【参考方案4】:面对同样的问题,我们唯一做的就是教育小米用户按照@anup-dasari所说的步骤,并将gcm优先级设置为高,将来可能会有持久服务
【讨论】:
以上是关于当应用程序未运行时,GCM 推送通知未在某些设备中显示的主要内容,如果未能解决你的问题,请参考以下文章