RAM清除时未收到Android GCM

时间:2017-05-11 09:10:41

标签: android google-cloud-messaging android-service gcmlistenerservice

在chat / voip应用程序中,我需要实现GCM,以便在设备休眠或我的服务未运行时发送通知。一切正常,直到我轻扫关闭应用程序或清除我的Android设备的内存。之后我的服务没有启动,GCMListener不再被解雇了。

我已经阅读了几乎所有有关此问题的Stack溢出问题和答案,但尚未找到解决方案。

简化的Android.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

    <uses-sdk android:minSdkVersion="15" />

    <supports-screens
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true"
        android:xlargeScreens="true" />

    <uses-feature
        android:name="android.hardware.telephony"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.wifi"
        android:required="true" />
    <uses-feature
        android:name="android.hardware.sip.voip"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.microphone"
        android:required="true" />

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <permission
        android:name="com.example.app.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.example.app.permission.C2D_MESSAGE" />

    <application
        android:name="com.example.app.activity.MyApplication"
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@drawable/logo"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:logo="@drawable/logo"
        android:theme="@style/AppTheme">

            .... activity and other stuffs

        <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.example.app" />
            </intent-filter>
        </receiver>


        <service
            android:name="com.example.app.gcm.PushMessageReceiver"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>
        <service
            android:name="com.example.app.gcm.GCMInstanceIDListenerService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.android.gms.iid.InstanceID" />
            </intent-filter>
        </service>
        <service
            android:name="com.example.app.gcm.RegistrationIntentService"
            android:exported="false">
        </service>


    </application>

</manifest>

GCMListenerService

public class PushMessageReceiver extends GcmListenerService {

    @Override
    public void onMessageReceived(String from, Bundle data) {

            Intent intent = new Intent(this, MyService.class);
            intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
            intent.replaceExtras(data);
            startService(intent);
        }
    }

}

我在logcat中遇到以下错误 -

05-11 14:47:59.278 23984-23984/? W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10000000 pkg=com.example.app (has extras) }

我实际上有两个问题。

  1. 为什么我的START_STICKY服务在像miui和huawei这样的设备中清理内存后没有重新启动。
  2. 清理内存后或几小时后,我的GCMListener不再被触发。但我确信我从服务器获取GCM,因为我在Logcat上看到了这个错误。如何确保我的GCMListener着火?
  3. 任何建议都会非常有用。

    由于

    注意:如果应用程序处于forground或background(按下主页),我的应用程序正在接收GCM。但是从最近的应用程序和清除内存中关闭时不会得到。我没有强行关闭我的应用程序。只需清除RAM。

1 个答案:

答案 0 :(得分:1)

部分手机制造商,例如除非用户允许,否则小米和华为不允许该应用程序在后台运行。 这意味着当用户滑动或清理RAM时,后台服务将被终止

对于小米,用户可以通过将其添加到自动开始列表来授予对应用的访问权限。

对于华为来说,它叫做TelephonyManager。有一个视图选项,您必须将应用程序列入白名单