채팅/VoIP 애플리케이션에서 기기가 절전 상태이거나 서비스가 실행되지 않고있는 동안 알림을 보내려면 GCM을 구현해야했습니다. 앱을 닫거나 안드로이드 기기의 메모리를 지우기 전까지는 모든 것이 잘 작동합니다. 그 후 내 서비스가 시작되지 않고 GCMListener가 더 이상 해고되지 않습니다.RAM이 지워졌을 때 Android GCM을받지 못했습니다.
이 문제와 관련된 거의 모든 스택 오버플로 질문과 대답을 읽었지만 아직 해결책을 찾을 수 없습니다.
간체 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);
}
}
}
나는 다음과 같은 얻을 오류 -
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) }
는 사실은 두 가지 질문이 있습니다.
- miui 및 huawei와 같은 기기에서 메모리 정리 후 내 START_STICKY 서비스가 다시 시작되지 않는 이유는 무엇입니까?
- 메모리를 정리 한 후 또는 2 시간 후 GCBist가 더 이상 실행되지 않습니다. 하지만 Logcat에서 오류가 발생하면 서버에서 GCM을 얻고 있습니다. 내 GCMListener가 화재를 일으키는 지 확인하는 방법은 무엇입니까?
어떤 제안이 도움이 될 것입니다.
감사
참고 : 내 응용 프로그램은 GCM을 받고있는 경우를 forground이나 배경 (누르면 홈)에서 응용 프로그램. 하지만 최근 앱에서 스 와이프하여 지우고 메모리를 지우지 않는 경우. 나는 앱을 강제로 종료하지 않는다. 그냥 RAM을 지우십시오.
양식 최근 앱 목록을 스 와이프 할 때 onMessageReceived 메소드에서 콜백을 받습니까? – Gautam
@Gautam 아니요. 홈 버튼을 누르면 콜백이 시작됩니다. –
내 대답보기 [여기] (http://stackoverflow.com/a/39505298/4625829) –