2013-08-15 4 views
12

Ho due app che ho creato e sto provando a inviare un intento da uno all'altro, ma l'intento non arriva mai allo onReceive() tuttavia questo problema è solo un modo. La prima app può inviare al secondo ma il secondo non può inviare informazioni. Sto usando una diversa azione intent per inviare dal secondo al primo, ma altrimenti sono identici. Qualche idea sul perché questo potrebbe non funzionare? Ho provato tutto quello che riesco a pensare e leggere la maggior parte dei post che ho trovato qui e senza risultati.Ricevitore broadcast Android che non riceve l'intento

Non si arresta o mi dà alcuna indicazione su ciò che sta accadendo nel logcat, non fa nulla.

funzione di invio

private void sendFinishLog(String ID, String Cond) 
{ 
    Log.d("me", "send finish log"); 
    Intent logIntent = new Intent(); 
    logIntent.putExtra("ID", ID); 
    logIntent.putExtra("Cond", Cond); 
    logIntent.setAction("com.me.intent.finishlog"); 
    Log.d("me","logIntent : " + logIntent.toString() 
     +logIntent.getExtras().toString()); 
    sendBroadcast(logIntent); 
} 

ricevono classe

public class LogReceiver extends BroadcastReceiver { 

    public static ArrayList<LogDataHolder> logData = new ArrayList<LogDataHolder>(); 
    private boolean found; 
    static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
    private static String lasttime; 
    private static String now = "Boot time"; 
    @Override 
    public void onReceive(Context cont, Intent logIntent) 
    { 
     Log.d("me","On receive"); 
       etc..... 
    } 

Ricevere file manifest

<!-- for receiving logs --> 
<receiver 
    android:name = "LogReceiver" 
    android:enabled="true"> 
    <intent_filter> 
     <action android:name="com.me.intent.finishlog" /> 
    </intent_filter> 
</receiver> 
+1

hai registrato il ricevitore? – bofredo

+0

Nel manifest – Cob50nm

+0

no, programmaticamente – bofredo

risposta

7

qualcosa di simile:

public void onResume() { 
    IntentFilter filter = new IntentFilter(); 
    getActivity().registerReceiver(mLogReceiver,filter); 
} 

e per annullare la registrazione:

public void onPause() { 
    getActivity().unregsiterReceiver(mLogreceiver); 
} 

edit: Ho solo pensato che il vostro LogReceiver classe non ha né costruttore né è necessario scrivere un aswell:

private LogReceiver mLogReceiver = new LogReceiver() { 

e dopo che è possibile utilizzare il OnReceive-metodo come lo avete già nel vostro codice.

+1

il metodo overriden onReceive deve essere all'interno del {} della mia ultima riga. – bofredo

+2

non hai bisogno di fare questo se lo fai nel manifest anche se – Cob50nm

+0

è valido anche per il costruttore? – bofredo

3

Prova di nuovo come questo. La categoria può essere necessario aggiungere

<!-- for receiving logs --> 
<receiver 
    android:name = "LogReceiver" 
    android:enabled="true"> 
    <intent_filter> 
     <action android:name="com.me.intent.finishlog" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     </intent_filter> 
</receiver> 
+0

Cosa significa però il default? Significa uno standard di Android o può essere utilizzato per azioni di intento personalizzato? – Cob50nm

+0

Se non è necessario aggiungere un'azione, non è necessario aggiungere una categoria. Se si aggiunge l'azione, penso sia necessario aggiungere una categoria per indicare come utilizzare questa azione – Eden

0

È dichiarato il ricevitore nel manifesto come:

android:name = "LogReceiver" 

Le documentation afferma che il nome dovrebbe essere:

Il nome della classe che implementa il ricevitore di broadcast, un sottoclasse di BroadcastReceiver . Questo dovrebbe essere un nome completo della classe (come "com.example.project.ReportReceiver"). Tuttavia, come una stenografia , se il primo carattere del nome è un punto (per l'esempio , "ReportReceiver"), viene aggiunto al nome del pacchetto specificato nell'elemento.

In altre parole, è necessario includere il pacchetto. Provare a cambiare il nome in:

android:name = ".LogReceiver" 

o

android:name = "com.me.yourpackagename.LogReceiver" 
+1

L'ho provato e non ha funzionato – Cob50nm

+0

Pubblica un progetto completo. Il progetto completo –

+0

è> 50.000 linee di codice, quindi non è proprio un'opzione – Cob50nm

1

Il mio problema è stato risolto quando ho rimosso il ricevitore unregister dal OnPause(). metodo.