2014-02-11 1 views
2

Я реализовал сервис GCM, и все работает отлично, но когда я должен получить уведомление после того, как я закрыл приложение (по длинному клику на домашней кнопке, а затем на иконке мусора - Galaxy S III), я этого не понимаю.GCM BroadcastReceiver запускается только в том случае, когда приложение запущено или запущено на фоне

Вот мой Manifest.xml:

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

    <uses-sdk 
     android:minSdkVersion="12" 
     android:targetSdkVersion="18" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 
    <!-- The following two permissions are not required to use 
     Google Maps Android API v2, but are recommended. --> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <permission android:name="com.example.proj.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 
    <uses-permission android:name="com.example.proj.permission.C2D_MESSAGE" /> 


    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true"/> 
    <application 
     android:allowBackup="true" 
     android:icon="@drawable/projicon" 
     android:label="@string/app_name" 
     android:theme="@style/Theme.Sherlock" 
     android:uiOptions="splitActionBarWhenNarrow" > 
     <activity 
      android:name="com.example.proj.FbActivity" 
      android:label="@string/app_name" 
      android:configChanges="keyboardHidden|orientation|screenSize" 
      android:uiOptions="splitActionBarWhenNarrow"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
      <meta-data 
      android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version" /> 
      <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="APIKEY"/> 
     <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/> 
     <activity android:name="com.facebook.LoginActivity"></activity> 
     <activity android:name="MainActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize"></activity> 

     <receiver 
      android:name="com.example.proj.GcmBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <category android:name="com.example.proj" /> 
      </intent-filter> 
     </receiver> 
     <service android:name="com.example.proj.GcmIntentService" /> 
    </application> 
</manifest> 

GcmBroadcastReceiver.java:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Explicitly specify that GcmIntentService will handle the intent. 
     ComponentName comp = new ComponentName(context.getPackageName(), 
       GcmIntentService.class.getName()); 
     // Start the service, keeping the device awake while it is launching. 
     startWakefulService(context, (intent.setComponent(comp))); 
     setResultCode(Activity.RESULT_OK); 
    } 

} 

Я не уверен, если, закрыв приложение, кстати, я сделал убивает приложение или он все равно должен работать на заднем плане и получать эти файлы.

+0

Возможный дубликат [Android GCM (push notification): устройство не получает уведомления, если приложение остановлено] (http://stackoverflow.com/questions/12073449/android-gcm-push-notification-device-doesnt- receive-notification-if-applyat) – Eran

+0

Я видел этот вопрос, но насколько я знаю и что прочитал, этот тип закрытия не должен закрывать фоновые процессы/службы, которые работают. Вот почему я указал на этот конкретный способ, а не на завершение процессов, перейдя к настройке и т. Д. – Juvi

ответ

6

У меня была такая же проблема, и я узнал, что я сделал ошибку в файле манифеста:

<permission android:name="com.example.gcm.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 
    <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> 

должно быть:

<permission android:name="<your app package>.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="<your app package>.permission.C2D_MESSAGE" /> 

где пакет приложение является пакет, который содержит класс, который расширяет Application (и должен указываться в файле манифеста).

После того, как я установил это, я смог принудительно закрыть приложение и получать уведомления о нажатии через GCM.

+0

Решил мою проблему, спасибо Марко! – Juvi

+1

это не решило мою проблему. Вы можете мне помочь? Для каких пакетов shouls я заменяю имя пакета именем моего пакета? только для разрешения. C2D_MESSAGE? –

Смежные вопросы