在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) }
我实际上有两个问题。
任何建议都会非常有用。
由于
注意:如果应用程序处于forground或background(按下主页),我的应用程序正在接收GCM。但是从最近的应用程序和清除内存中关闭时不会得到。我没有强行关闭我的应用程序。只需清除RAM。
答案 0 :(得分:1)
部分手机制造商,例如除非用户允许,否则小米和华为不允许该应用程序在后台运行。 这意味着当用户滑动或清理RAM时,后台服务将被终止
对于小米,用户可以通过将其添加到自动开始列表来授予对应用的访问权限。
对于华为来说,它叫做TelephonyManager。有一个视图选项,您必须将应用程序列入白名单