0

채팅/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) } 

는 사실은 두 가지 질문이 있습니다.

  1. miui 및 huawei와 같은 기기에서 메모리 정리 후 내 START_STICKY 서비스가 다시 시작되지 않는 이유는 무엇입니까?
  2. 메모리를 정리 한 후 또는 2 시간 후 GCBist가 더 이상 실행되지 않습니다. 하지만 Logcat에서 오류가 발생하면 서버에서 GCM을 얻고 있습니다. 내 GCMListener가 화재를 일으키는 지 확인하는 방법은 무엇입니까?

어떤 제안이 도움이 될 것입니다.

감사

참고 : 내 응용 프로그램은 GCM을 받고있는 경우를 forground이나 배경 (누르면 홈)에서 응용 프로그램. 하지만 최근 앱에서 스 와이프하여 지우고 메모리를 지우지 않는 경우. 나는 앱을 강제로 종료하지 않는다. 그냥 RAM을 지우십시오.

+0

양식 최근 앱 목록을 스 와이프 할 때 onMessageReceived 메소드에서 콜백을 받습니까? – Gautam

+0

@Gautam 아니요. 홈 버튼을 누르면 콜백이 시작됩니다. –

+0

내 대답보기 [여기] (http://stackoverflow.com/a/39505298/4625829) –

답변

1

예 : 전화 제조업체 중 일부. XiaoMi와 Huawei는 사용자가 허용하지 않는 한 백그라운드에서 실행되는 응용 프로그램을 허용하지 않습니다. 그것은 사용자가, 사용자가 자동 ​​시작 목록에 추가하여 응용 프로그램에 대한 액세스 권한을 부여 할 수 있습니다 떨어져 슬쩍 또는 샤오 미의 경우 RAM

를 청소 할 때 배경 서비스가 죽을 것을 의미합니다.

화웨이의 경우 TelephonyManager라고합니다. 앱을 허용 목록에 추가해야하는보기 옵션이 있습니다

+0

whatsapp 및 viber와 같은 응용 프로그램이 기본적으로 해당 사용 권한을 얻는 방법? 제조업체로부터 사용자의 허가를 요청하는 API가 있습니까? –

+0

whatsapp과 같은 유명한 앱은 기발한 권한을 갖습니다. 이 문제를 해결하기 위해 며칠을 보냈습니다. AFAIK, 응용 프로그램이 허가를 요청할 수있는 API가 없습니다. 특정 제조업체에 매우 한정적이므로 –