GcmListenerService不在应用程序处于后台时调用 [英] GcmListenerService is not called When Application is in Background

查看:157
本文介绍了GcmListenerService不在应用程序处于后台时调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当应用程序处于后台或手机处于锁定或处于睡眠模式但通知被触发时,不会调用GcmListenerService。这将如何被称为
当应用程序在前台的理想工作。
GcmListenerService的代码如下

  public class MyGcmListenerService extends GcmListenerService {

private static final String TAG =MyGcmListenerService;
LocalDataBaseManager mDbManager;
字符串消息;
随机randomNumber;
long ID;
/ **
*收到消息时调用。
*
* @param from SenderID of sender。
* @param data包含消息数据作为键/值对的数据包。
*对于密钥集使用data.keySet()。
* /
// [START receive_message]
@Override
public void onMessageReceived(String from,Bundle data){
String消息;
字符串标题;
// ID = Utils.getIDForPush(pushId,this);
// if(ID == 0){
// ID = 1;
//} else {
// ID + = 1;
//}
// Utils.saveIDForPush(pushId,ID,this);
Bundle bundle = data.getBundle(notification);
if(bundle!= null){
message = bundle.getString(body);
title = bundle.getString(title);
Log.d(TAG,From:+ from);
Log.d(TAG,Message:+ message);}
else {
message =;
title =新农合;
}

mDbManager = LocalDataBaseManager.getInstance(this);
if(from.startsWith(/ topics /)){
Calendar c = Calendar.getInstance();
SimpleDateFormat s = new SimpleDateFormat(ddMMyyyyhhmmss);
String format = s.format(new Date());
ID = Long.parseLong(format);
String date = new SimpleDateFormat(dd-MM-yyyy HH:mm,Locale.ENGLISH).format(new Date());
警告warnings = new Warnings();
warnings.setWARNING_ID(ID);
warnings.setWARNING_EN(message);
warnings.setWARNING_AR(message);
warnings.setSTART_DATE_TIME(date);
warnings.setNotification_type(String.valueOf(Constant.NotificationType.PUSH));
warnings.setSEVERITY();
warnings.setEND_DATE_TIME();
warnings.setUPDATE_NO();
mDbManager.insertNotificationInfo(warnings);
//从某个主题收到的消息。
} else {
//正常的下行消息。
}

// [START_EXCLUDE]
/ **
*生产应用程序通常会在此处理消息。
*例如: - 与服务器同步。
* - 将消息存储在本地数据库中。
* - 更新用户界面。
* /

/ **
*在某些情况下,显示向用户显示收到消息的通知
*会很有用。
* /
// KeyguardManager km =(KeyguardManager)this.getSystemService(Context.KEYGUARD_SERVICE);
// boolean locked = km.inKeyguardRestrictedInputMode();
//
// String release = android.os.Build.VERSION.RELEASE;
//
//
// if(Integer.parseInt(String.valueOf(release.charAt(0)))< 5&& locked){
//
// this.stopService(new Intent(this,NotificationService.class));
// Intent serviceIntent = new Intent(this,NotificationService.class);
// this.startService(serviceIntent);
//
//}
sendNotification(title,message);
// [END_EXCLUDE]
}
// [END receive_message]

/ **
*创建并显示包含接收到的GCM的简单通知信息。
*
* @参数消息收到GCM消息。
* /
private void sendNotification(String title,String message){
Intent intent = new Intent(this,MainActivity.class);
intent.putExtra(message,message);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0 / * Request code * /,intent,
PendingIntent.FLAG_ONE_SHOT);

Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ncms_launcher)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);

NotificationManager notificationManager =
(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

notificationManager.notify(0 / *通知的ID * /,notificationBuilder.build());


此服务的清单信息如下

 < service 
android:name =。gcm.MyGcmListenerService
android:exported =false>
< intent-filter>
< / intent-filter>
< / service>

我在这里错过了什么。

解决方案

我遇到的问题是,当应用程序在后台或强制关闭,然后通知被触发,但不是通过GcmListenService,而是通过GCMReceiver
所以我扩展GCMReceiver,并使它像这样当应用程序处于前景或背景或强制杀死时。它将在修改后被称为
GCMListenerService如下

  public class MyGcmListenerService extends GcmListenerService {

private static final String TAG =MyGcmListenerService;
LocalDataBaseManager mDbManager;
字符串消息;
随机randomNumber;
long ID;
/ **
*收到消息时调用。
*
* @param from SenderID of sender。
* @param data包含消息数据作为键/值对的数据包。
*对于密钥集使用data.keySet()。
* /
// [START receive_message]
@Override
public void onMessageReceived(String from,Bundle data){
String消息;
字符串标题;
// ID = Utils.getIDForPush(pushId,this);
// if(ID == 0){
// ID = 1;
//} else {
// ID + = 1;
//}
// Utils.saveIDForPush(pushId,ID,this);
Bundle bundle = data.getBundle(notification);
if(bundle!= null){
message = bundle.getString(body);
title = bundle.getString(title);
Log.d(TAG,From:+ from);
Log.d(TAG,Message:+ message);}
else {
message =;
title =新农合;
}

mDbManager = LocalDataBaseManager.getInstance(this);
if(from.startsWith(/ topics /)){
Calendar c = Calendar.getInstance();
SimpleDateFormat s = new SimpleDateFormat(ddMMyyyyhhmmss);
String format = s.format(new Date());
ID = Long.parseLong(format);
String date = new SimpleDateFormat(dd-MM-yyyy HH:mm,Locale.ENGLISH).format(new Date());
警告warnings = new Warnings();
warnings.setWARNING_ID(ID);
warnings.setWARNING_EN(message);
warnings.setWARNING_AR(message);
warnings.setSTART_DATE_TIME(date);
warnings.setNotification_type(String.valueOf(Constant.NotificationType.PUSH));
warnings.setSEVERITY();
warnings.setEND_DATE_TIME();
warnings.setUPDATE_NO();
mDbManager.insertNotificationInfo(warnings);
//从某个主题收到的消息。
} else {
//正常的下行消息。
}

// [START_EXCLUDE]
/ **
*生产应用程序通常会在此处理消息。
*例如: - 与服务器同步。
* - 将消息存储在本地数据库中。
* - 更新用户界面。
* /

/ **
*在某些情况下,显示向用户显示收到消息的通知
*会很有用。
* /
// KeyguardManager km =(KeyguardManager)this.getSystemService(Context.KEYGUARD_SERVICE);
// boolean locked = km.inKeyguardRestrictedInputMode();
//
// String release = android.os.Build.VERSION.RELEASE;
//
//
// if(Integer.parseInt(String.valueOf(release.charAt(0)))< 5&& locked){
//
// this.stopService(new Intent(this,NotificationService.class));
// Intent serviceIntent = new Intent(this,NotificationService.class);
// this.startService(serviceIntent);
//
//}
sendNotification(title,message);
// [END_EXCLUDE]
}
// [END receive_message]

/ **
*创建并显示包含接收到的GCM的简单通知信息。
*
* @参数消息收到GCM消息。
* /
private void sendNotification(String title,String message){
Intent intent = new Intent(this,MainActivity.class);
intent.putExtra(message,message);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0 / * Request code * /,intent,
PendingIntent.FLAG_ONE_SHOT);

Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ncms_launcher)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);

NotificationManager notificationManager =
(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

notificationManager.notify(0 / *通知的ID * /,notificationBuilder.build());


$ / code $ / pre

和GCM Receiver如下

  public class GcmBroadcastReceiver extends GcmReceiver {

LocalDataBaseManager mDbManager;
@Override
public void onReceive(Context context,Intent intent){
mDbManager = LocalDataBaseManager.getInstance(context);
Bundle bundle = intent.getExtras();
bundle.keySet();
Set< String> keySet = bundle.keySet(); (keySet!= null&& keySet.isEmpty()== false){
Iterator< String> it = keySet.iterator();
int i = 0;
while(it.hasNext()){
String key = it.next();
String desc = bundle.getString(key);
Log.d(BroadCast Values,key ++ desc);
}
}
Log.d(,在广播接收器的接收方法中);
$ b $ if(bundle!= null&& bundle.containsKey(gcm.notification.body)){
String message = bundle.getString(gcm.notification.body , );
Long ID = new Date()。getTime();
String date = new SimpleDateFormat(dd-MM-yyyy HH:mm,Locale.ENGLISH).format(new Date());
警告warnings = new Warnings();
warnings.setWARNING_ID(ID);
warnings.setWARNING_EN(message);
warnings.setWARNING_AR(message);
warnings.setSTART_DATE_TIME(date);
warnings.setNotification_type(String.valueOf(Constant.NotificationType.PUSH));
warnings.setSEVERITY();
warnings.setEND_DATE_TIME();
warnings.setUPDATE_NO();
mDbManager.insertNotificationInfo(warnings);
//从某个主题收到的消息。
}

super.onReceive(context,intent);
// ComponentName cn = new ComponentName(context.getPackageName(),RegistrationIntentService.class.getName());
// startWakefulService(context,intent.setComponent(cn));
// setResultCode(Activity.RESULT_OK);


$ / code>

GCMReceiver的清单更改如下

 < receiver 
android:name =。gcm.GcmBroadcastReceiver
android:exported =true
android:permission =com.google.android.c2dm.permission.SEND>
< intent-filter>
< category android:name =com.uae.ncms/>
< / intent-filter>
< / receiver>
< service
android:name =。gcm.MyGcmListenerService
android:exported =false>
< intent-filter>
< / intent-filter>
< / service>


GcmListenerService is not called when application is in background or when phone is locked or in sleep mode but notification is fired. How this will be called When App is in foreground its working ideally. Code for GcmListenerService is following

  public class MyGcmListenerService extends GcmListenerService {

    private static final String TAG = "MyGcmListenerService";
    LocalDataBaseManager mDbManager;
    String message;
    Random randomNumber;
    long ID;
    /**
     * Called when message is received.
     *
     * @param from SenderID of the sender.
     * @param data Data bundle containing message data as key/value pairs.
     *             For Set of keys use data.keySet().
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(String from, Bundle data) {
        String message ;
        String title;
//        ID = Utils.getIDForPush("pushId",this);
//        if(ID == 0){
//            ID = 1;
//        }else {
//            ID += 1;
//        }
//        Utils.saveIDForPush("pushId",ID,this);
        Bundle bundle = data.getBundle("notification");
        if(bundle!= null){
        message = bundle.getString("body");
        title = bundle.getString("title");
            Log.d(TAG, "From: " + from);
            Log.d(TAG, "Message: " + message);}
        else {
            message ="";
            title = "NCMS";
        }

        mDbManager = LocalDataBaseManager.getInstance(this);
        if (from.startsWith("/topics/")) {
            Calendar c = Calendar.getInstance();
            SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");
            String format = s.format(new Date());
            ID = Long.parseLong(format);
            String date = new SimpleDateFormat("dd-MM-yyyy HH:mm", Locale.ENGLISH).format(new Date());
            Warnings warnings = new Warnings();
            warnings.setWARNING_ID(ID);
            warnings.setWARNING_EN(message);
            warnings.setWARNING_AR(message);
            warnings.setSTART_DATE_TIME(date);
            warnings.setNotification_type(String.valueOf(Constant.NotificationType.PUSH));
            warnings.setSEVERITY("");
            warnings.setEND_DATE_TIME("");
            warnings.setUPDATE_NO("");
            mDbManager.insertNotificationInfo(warnings);
            // message received from some topic.
        } else {
            // normal downstream message.
        }

        // [START_EXCLUDE]
        /**
         * Production applications would usually process the message here.
         * Eg: - Syncing with server.
         *     - Store message in local database.
         *     - Update UI.
         */

        /**
         * In some cases it may be useful to show a notification indicating to the user
         * that a message was received.
         */
//        KeyguardManager km = (KeyguardManager) this.getSystemService(Context.KEYGUARD_SERVICE);
//        boolean locked = km.inKeyguardRestrictedInputMode();
//
//        String release = android.os.Build.VERSION.RELEASE;
//
//
//        if (Integer.parseInt(String.valueOf(release.charAt(0))) < 5 && locked) {
//
//            this.stopService(new Intent(this, NotificationService.class));
//            Intent serviceIntent = new Intent(this, NotificationService.class);
//            this.startService(serviceIntent);
//
//        }
        sendNotification(title,message);
        // [END_EXCLUDE]
    }
    // [END receive_message]

    /**
     * Create and show a simple notification containing the received GCM message.
     *
     * @param message GCM message received.
     */
    private void sendNotification(String title,String message) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra("message",message);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ncms_launcher)
                .setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

Manifest info for this service is following

 <service
        android:name=".gcm.MyGcmListenerService"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

What I am missing here.

解决方案

The Issue I was facing was when Application is in background or force closed then notification is fired but not through GcmListenService but through GCMReceiver So I extended GCMReceiver and made it something like this with this when application is in foreground or in background or force killed. it will be called GCMListenerService after modification is as following

 public class MyGcmListenerService extends GcmListenerService {

    private static final String TAG = "MyGcmListenerService";
    LocalDataBaseManager mDbManager;
    String message;
    Random randomNumber;
    long ID;
    /**
     * Called when message is received.
     *
     * @param from SenderID of the sender.
     * @param data Data bundle containing message data as key/value pairs.
     *             For Set of keys use data.keySet().
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(String from, Bundle data) {
        String message ;
        String title;
//        ID = Utils.getIDForPush("pushId",this);
//        if(ID == 0){
//            ID = 1;
//        }else {
//            ID += 1;
//        }
//        Utils.saveIDForPush("pushId",ID,this);
        Bundle bundle = data.getBundle("notification");
        if(bundle!= null){
        message = bundle.getString("body");
        title = bundle.getString("title");
            Log.d(TAG, "From: " + from);
            Log.d(TAG, "Message: " + message);}
        else {
            message ="";
            title = "NCMS";
        }

        mDbManager = LocalDataBaseManager.getInstance(this);
        if (from.startsWith("/topics/")) {
            Calendar c = Calendar.getInstance();
            SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");
            String format = s.format(new Date());
            ID = Long.parseLong(format);
            String date = new SimpleDateFormat("dd-MM-yyyy HH:mm", Locale.ENGLISH).format(new Date());
            Warnings warnings = new Warnings();
            warnings.setWARNING_ID(ID);
            warnings.setWARNING_EN(message);
            warnings.setWARNING_AR(message);
            warnings.setSTART_DATE_TIME(date);
            warnings.setNotification_type(String.valueOf(Constant.NotificationType.PUSH));
            warnings.setSEVERITY("");
            warnings.setEND_DATE_TIME("");
            warnings.setUPDATE_NO("");
            mDbManager.insertNotificationInfo(warnings);
            // message received from some topic.
        } else {
            // normal downstream message.
        }

        // [START_EXCLUDE]
        /**
         * Production applications would usually process the message here.
         * Eg: - Syncing with server.
         *     - Store message in local database.
         *     - Update UI.
         */

        /**
         * In some cases it may be useful to show a notification indicating to the user
         * that a message was received.
         */
//        KeyguardManager km = (KeyguardManager) this.getSystemService(Context.KEYGUARD_SERVICE);
//        boolean locked = km.inKeyguardRestrictedInputMode();
//
//        String release = android.os.Build.VERSION.RELEASE;
//
//
//        if (Integer.parseInt(String.valueOf(release.charAt(0))) < 5 && locked) {
//
//            this.stopService(new Intent(this, NotificationService.class));
//            Intent serviceIntent = new Intent(this, NotificationService.class);
//            this.startService(serviceIntent);
//
//        }
        sendNotification(title,message);
        // [END_EXCLUDE]
    }
    // [END receive_message]

    /**
     * Create and show a simple notification containing the received GCM message.
     *
     * @param message GCM message received.
     */
    private void sendNotification(String title,String message) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra("message",message);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ncms_launcher)
                .setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
} 

and GCM Receiver is as following

   public class GcmBroadcastReceiver extends GcmReceiver {

    LocalDataBaseManager mDbManager;
    @Override
    public void onReceive(Context context, Intent intent) {
        mDbManager = LocalDataBaseManager.getInstance(context);
        Bundle bundle = intent.getExtras();
        bundle.keySet();
        Set<String> keySet = bundle.keySet();
        if(keySet != null && keySet.isEmpty() == false) {
            Iterator<String> it = keySet.iterator();
           int i = 0;
            while(it.hasNext()){
               String  key = it.next();
               String  desc = bundle.getString(key);
               Log.d("BroadCast Values",key +"  "+desc);
            }
        }
        Log.d("", "In Receive Method of Broadcast Receiver");

        if (bundle != null && bundle.containsKey("gcm.notification.body")) {
            String message = bundle.getString("gcm.notification.body","");
            Long ID = new Date().getTime();
            String date = new SimpleDateFormat("dd-MM-yyyy HH:mm", Locale.ENGLISH).format(new Date());
            Warnings warnings = new Warnings();
            warnings.setWARNING_ID(ID);
            warnings.setWARNING_EN(message);
            warnings.setWARNING_AR(message);
            warnings.setSTART_DATE_TIME(date);
            warnings.setNotification_type(String.valueOf(Constant.NotificationType.PUSH));
            warnings.setSEVERITY("");
            warnings.setEND_DATE_TIME("");
            warnings.setUPDATE_NO("");
            mDbManager.insertNotificationInfo(warnings);
            // message received from some topic.
        }

        super.onReceive(context, intent);
//        ComponentName cn = new ComponentName(context.getPackageName(), RegistrationIntentService.class.getName());
//        startWakefulService(context, intent.setComponent(cn));
//        setResultCode(Activity.RESULT_OK);
    }
}

Manifest changes for GCMReceiver is following

   <receiver
            android:name=".gcm.GcmBroadcastReceiver"
            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.uae.ncms" />
            </intent-filter>
        </receiver>
<service
        android:name=".gcm.MyGcmListenerService"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

这篇关于GcmListenerService不在应用程序处于后台时调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆