Android Oreo - BroadcastReceiver + JobIntentService无法正常工作(GCM通知)

时间:2018-03-05 18:55:06

标签: android service notifications google-cloud-messaging receiver

我有一个带有GCM推送通知的应用。通知从CMS发送。
我的appTargetSdkVersion = 27。
除了两个事实外,一切正常:

  1. 应用在设备上被杀死时不会收到通知 Android版低于奥利奥。

  2. On Oreo我必须打开设备屏幕才能接收通知。

  3. 我不知道为什么它会像那样。
    *在BroadcastReceiver的onReceive方法中我排队工作并启动JobIntentService onHandleWork方法发布通知。
    *在我使用WakefulBroadcastReceiver + startWakefulService + IntentService之前它工作了精细。但是我改变了这个实现,因为在将targetSdk升级到27个通知后,停止在Oreo上工作(我知道它是由后台服务限制引起的)。

    修改
    我通过将通知渠道参数IMPORTANCE从IMPORTANCE_DEFAULT更改为IMPORTANCE_HIGH来解决此问题!

    我的GcmReceiver类:

    public class GcmReceiver extends BroadcastReceiver {
    
    @Override
    public void onReceive(Context context, Intent intent) {
        ComponentName comp = new ComponentName(context.getPackageName(),
                GcmNotificationService.class.getName());
        GcmNotificationService.enqueueWork(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
    

    }

    我的JobIntentService类:

    public class GcmNotificationService extends JobIntentService {
    
    private static final String TAG = "GcmNotificationService";
    private Random random = new Random();
    
    static final int JOB_ID = 1000;
    
    static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, GcmNotificationService.class, JOB_ID, work);
    }
    @Override
    protected void onHandleWork(Intent intent) {
        Bundle extras = intent.getExtras();
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
    
        String messageType = gcm.getMessageType(intent);
    
        if (!extras.isEmpty()) {
            if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
                Log.e(TAG, "Send error: " + extras.toString());
            } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
                Log.e(TAG, "Deleted messages on server: " + extras.toString());
            } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
                String title = (String) extras.get(Config.MESSAGE_TITLE);
                String description = (String) extras.get(Config.MESSAGE_TEXT);
                boolean isUpdate = false;
                try {
                    isUpdate = 1 == Integer.parseInt((String) extras.get(Config.MESSAGE_UPDATE));
                } catch (NullPointerException | NumberFormatException e) {
                    e.printStackTrace();
                }
    
                if (new Preferences(this).getBool(Constant.PREFS_NOTIFICATIONS_ENABLED, true)) {
                    sendNotification(title, description, isUpdate);
                }
            }
        }
    }
    

0 个答案:

没有答案