2013-08-15 10 views
12

Mam dwie aplikacje, które zrobiłem, i próbuję wysłać intencję z jednego do drugiego, ale intencja nigdy nie dociera do onReceive() jednak ten problem jest tylko jeden sposób. Pierwsza aplikacja może wysyłać do drugiej, ale druga nie może wysłać informacji zwrotnej. Używam innej akcji zamiaru wysyłania od drugiej do pierwszej, ale poza tym są identyczne. Wszelkie pomysły na to, dlaczego to nie działa? Próbowałem wszystkiego, co wymyśliłem i przeczytałem większość postów, które mogłem znaleźć tutaj i bezskutecznie.Odbiornik transmisji Android nie otrzymuje intencji

Nie załamuje się ani nie daje mi żadnych wskazówek co do tego, co dzieje się w logcat, to nic nie robi.

funkcja wyślij

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); 
} 

otrzymać klasa

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..... 
    } 

Odbieranie aplikacja manifest

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

czy zarejestrowałeś odbiornik? – bofredo

+0

W manifeście – Cob50nm

+0

nie, programowo – bofredo

Odpowiedz

7

coś takiego:

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

i wyrejestrować:

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

edit: Właśnie pomyślałem, że LogReceiver-klasa nie ma również konstruktora. trzeba będzie napisać jedną aswell:

private LogReceiver mLogReceiver = new LogReceiver() { 

i po tym można użyć onReceive-metoda jak masz go już w kodzie.

+1

musi zostać zmieniona metoda onReceive wewnątrz {} mojej ostatniej linii. – bofredo

+2

Nie musisz tego robić, jeśli robisz to w manifeście, ale – Cob50nm

+0

jest to ważne również dla konstruktora? – bofredo

3

Spróbuj jeszcze raz tak. Kategoria konieczne może być dodany

<!-- 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

Co jednak oznacza wartość domyślna? Czy to oznacza standardowy Android, czy może być użyty do niestandardowych działań intencyjnych? – Cob50nm

+0

Jeśli nie musisz dodawać akcji, nie musisz dodawać kategorii. Ale jeśli dodasz akcję, myślę, że konieczne jest dodanie kategorii, aby wskazać, jak użyć tej akcji. – Eden

0

zadeklarowanej odbiornik w manifeście jako:

android:name = "LogReceiver" 

The documentation stanach że nazwa powinna być:

Nazwą klasy, która implementuje odbiornik broadcast, a podklasy BroadcastReceiver . Powinna to być pełna nazwa klasy (np. "Com.example.project.ReportReceiver"). Jednak jako skrót nazwy, jeśli pierwszym znakiem nazwy jest kropka (dla przykładu , "ReportReceiver"), jest ona dołączana do nazwy pakietu określonej w elemencie.

Innymi słowy, musi zawierać pakiet. Spróbuj zmienić nazwę na:

android:name = ".LogReceiver" 

lub

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

Próbowałem tego i nie zadziałało – Cob50nm

+0

Opublikuj kompletny projekt. –

+0

kompletny projekt jest> 50 000 linii kodu, więc tak naprawdę nie jest to opcja – Cob50nm

1

Mój problem został rozwiązany, gdy usunąłem odbiornik wyrejestrować się z OnPause(). metoda.