2012-01-11 18 views
7

Avevo un'applicazione C2DM funzionante. Ho riutilizzato lo stesso nome del pacchetto durante la creazione di una nuova applicazione C2DM.C2DM Broadcast Receiver

Funziona tranne che ora BroadcastReceiver non viene chiamato quando l'applicazione non è in esecuzione. Vale a dire che funziona tutto se eseguo l'applicazione e la invio di messaggi C2DM. Ma dopo che una forza si è ritirata, BroadcastReceiver non viene più chiamato.

Ho esaminato molti esempi e ho confrontato tutto il mio vecchio manifest con quello nuovo. Prestare particolare attenzione ai nomi dei pacchetti utilizzati nelle categorie, Servizi di intenti, ecc.

Domanda: Esiste un errore di codifica/config C2DM comune che provoca il mancato richiamo di BroadcastReceiver dopo l'interruzione di un'app?

ottengo questo registro gatto quando invio un messaggio C2DM dopo l'uscita forzata della mia candidatura:

01-11 00: 54: 43,580: WARN/GTalkService (286): [DataMsgMgr] onda richiamata intento: result = CANCELED forIntent {act = com.google.android.c2dm.intent.RECEIVE cat = [com.aawwpcd.pcd3] (ha comparse)}

Ottengo uno di quelli per ogni messaggio C2DM che invio al dispositivo dopo la chiusura della domanda.

Sembra che l'intento sia in arrivo ma non venga trasmesso al mio BroadcastReceiver.

Edit:

Ecco i bit relavant dal BroadcastReceiver manifesto e:

BroadcastReciever

package com.aawwpcd.pcd3.c2dm; 

import ... 

public class C2DMBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public IBinder peekService(Context myContext, Intent service) { 
     return super.peekService(myContext, service); 
    } 

    public C2DMBroadcastReceiver() { 
     super(); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 

    ... 

    } 

} 

manifesto

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.aawwpcd.pcd3" 
     android:versionCode="250" 
     android:versionName="ICSPCD3"> 

<uses-sdk android:minSdkVersion="13" 
      android:targetSdkVersion="14"/> 

<permission android:name="com.aawwpcd.pcd3.permission.C2D_MESSAGE" android:protectionLevel="signature"/> 
<uses-permission android:name="com.aawwpcd.pcd3.permission.C2D_MESSAGE"/> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> 

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 

<application android:name=".PCD3Application" 
      android:label="@string/app_name" 
      android:icon="@drawable/pcdlauncher" 
      android:theme="@android:style/Theme.Holo"> 

    <activity android:name=".honeycombpcd3.FullScheduleActivity" 
       android:label="@string/app_namefull" 
      > 

     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 

    </activity> 

    <!-- Only C2DM servers can send messages for the app. If permission is not 
    set - any other app can generate it --> 
    <receiver android:name=".c2dm.C2DMBroadcastReceiver" 
       android:permission="com.google.android.c2dm.permission.SEND"> 

     <!-- Receive the actual message --> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE"/> 
      <category android:name="com.aawwpcd.pcd3"/> 
     </intent-filter> 

     <!-- Receive the registration id --> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> 
      <category android:name="com.aawwpcd.pcd3"/> 
     </intent-filter> 

    </receiver> 

</application> 

</manifest> 

Modifica: potrebbe essere qualcosa di nuovo in 3.x? Come detto sopra i miei problemi sono iniziati con questa nuova applicazione, scritta per 3.x. Quello che voglio è che il C2DM chiami BroadcastReceiver anche quando l'applicazione non è in esecuzione. Non lo vedo. Potrebbe essere un cambiamento 3.x? Ha funzionato in questo modo sui telefoni 2.3.x e non riesco a trovare nulla che sto facendo in modo diverso. Sarà una seccatura scrivere il codice di prova per dimostrarlo ma quello è il prossimo credo.

Modifica: Sembra collegato a Uscita forzata. Non ho alcun problema quando re-installo .apk e poi invio al dispositivo un messaggio c2dm; il ricevitore Broadcast lo preleva. In questo caso l'applicazione non era già in esecuzione quando è entrato C2DM, ma tutto ha funzionato come previsto. L'unico problema che sto avendo è dopo che ho forzato la chiusura di un'applicazione. I messaggi C2DM successivi non vengono rilevati da BroadcastReceiver.

+1

fornire '' tag del manifesto e del pacchetto della classe ricevitore – Jin35

+0

stesso problema e ho provato un sacco di cose per risolvere il problema. Apprezzo il fatto che sia solo dopo una chiusura forzata –

risposta

1

Avete monitorato logcat dopo aver "forzato la chiusura" del ricevitore alcune volte? È probabile che venga visualizzato un messaggio di "Processo non valido" che implica che il ricevitore si è bloccato in modo anomalo troppe volte e Android non invierà più intenti. Il riavvio del telefono/la reinstallazione dell'applicazione corregge questo problema come implicito nella modifica.

+0

Non c'è nessun messaggio "Processo non valido". Sto ottenendo un comportamento coerente: funziona a meno che non chiudo forzatamente l'applicazione. Lavorando voglio dire che i messaggi C2DM vengono prelevati dalla BroadcastReceiver, a prescindere dal fatto che l'applicazione è già in esecuzione, fino a quando ho Uscita forzata esso; dopo l'interruzione forzata, i messaggi C2DM non vengono recapitati a BroadcastReceiver. – Ayyrk

1

Basta aggiungere la bandiera qui sotto all'intenzione in sospeso che stai creando per generare notifiche push.

intent.addFlags (Intent.FLAG_INCLUDE_STOPPED_PACKAGES);

Dovrebbe funzionare postare questo.

+0

Questo ha funzionato per me. Aveva anche per eseguire l'applicazione senza il debugger, anche se si forza uscire da essa in seguito, ma questo può applicare solo a persone Xamarin Android. – hvaughan3

-1

Se il telefono dispone di un gestore delle autorizzazioni. Attiva le autorizzazioni di avvio automatico per la tua app. Google come farlo per il tuo telefono.