2011-07-12 15 views
9

Mam działanie, które nazywa odbiornik Broadcast. Odbiornik Broadcast czeka i słucha GPS. Kiedy słuchacz otrzymuje nowy punkt, chcę wysłać ten nowy punkt do Aktywności. Jak mogę przesłać dane z odbiornika Broadcast do Activity?Jak wysłać dane o wynikach z odbiornika Broadcast do Activity

Potrzebuję słuchacza w mojej działalności, czekając na odpowiedź od nadawcy. Jak mogę to zrobić?

Odpowiedz

4

Zdefiniowałem odbiornik dla mojego odbiornika i używam go w działaniu i działa teraz idealnie. Czy później może się zdarzyć jakiś problem?

public interface OnNewLocationListener { 
public abstract void onNewLocationReceived(Location location); 

}

w mojej klasie odbiornik którym jest nazwany ReceiverPositioningAlarm:

// listener ---------------------------------------------------- 

static ArrayList<OnNewLocationListener> arrOnNewLocationListener = 
     new ArrayList<OnNewLocationListener>(); 

// Allows the user to set an Listener and react to the event 
public static void setOnNewLocationListener(
     OnNewLocationListener listener) { 
    arrOnNewLocationListener.add(listener); 
} 

public static void clearOnNewLocationListener(
     OnNewLocationListener listener) { 
    arrOnNewLocationListener.remove(listener); 
} 

// This function is called after the new point received 
private static void OnNewLocationReceived(Location location) { 
    // Check if the Listener was set, otherwise we'll get an Exception when 
    // we try to call it 
    if (arrOnNewLocationListener != null) { 
     // Only trigger the event, when we have any listener 
     for (int i = arrOnNewLocationListener.size() - 1; i >= 0; i--) { 
      arrOnNewLocationListener.get(i).onNewLocationReceived(
        location); 
     } 
    } 
} 

aw jednej z metod mojej działalności to:

OnNewLocationListener onNewLocationListener = new OnNewLocationListener() { 
     @Override 
     public void onNewLocationReceived(Location location) { 
      // do something 

      // then stop listening 
      ReceiverPositioningAlarm.clearOnNewLocationListener(this); 
     } 
    }; 

    // start listening for new location 
    ReceiverPositioningAlarm.setOnNewLocationListener(
      onNewLocationListener); 
+3

Obawiam się, że zachowujesz silne referencje i to może być złe – GorillaApe

0

Wystarczy zaimplementować odbiornik transmisji w działaniu. zarejestruj odbiornik z kontekstem działania.

3

masz kilka sposobów na zrobienie tego i kilka uwag.

  1. można sondować, czyli sprawdzić każdy obecnie ponownie przy użyciu Handler lub timer, aby zobaczyć czy informacji przyjechał.

  2. Możesz zarejestrować odbiornik telewizyjny jako wewnętrzną klasę swojej aktywności, a następnie możesz wywoływać metody w swojej działalności.

  3. można mieć Broadcast Intent wysłać do klasy z informacji, ale jeśli działalność ta nie jest na pierwszym planie może doprowadzić go tam, a nie w 100% to, co chcesz ...

chodzi niektóre rozważania, BroadCastReciver jest głównie używany jako słuchacz, a nie jakaś wewnętrzna klasa, jest najlepszą praktyką, moim zdaniem, do użytku z Działalnością, dla Usług możesz użyć go jako samodzielnej klasy i zarejestrować ją w Manifest.xml .. Teraz musisz pamiętać, że kiedy transmisja jest nadawana, Twoja Aktywność może być nieaktywna z powodu zmiany orientacji lub zdarzenia, które zatrzymuje twoją aplikację, abyś mógł przegapić wydarzenie. Nie słucham zdarzeń systemowych, ale własnych zdarzeń, więc używam programu Sticky Notes, aby zapobiec temu problemowi.

+0

dzięki. w trzecim rozwiązaniu, jak mogę osiągnąć ten zamiar. czy mógłbyś wyjaśnić więcej? – breceivemail

+0

pewnie. Wysyłasz intencję, używając kontekstu.StartActivity() masz zamiar w działaniu na jeden z dwóch sposobów, używając metody getIntent w onCreate lub onResume lub w metodzie override onNewIntent. pytanie brzmi, czy twoja aktywność zostanie ponownie uruchomiona, możesz przeczytać więcej na ten temat w dokumencie Docelowa java doc i Intent java doc, konkretnie ta, która zajmuje się flagami Intent (SINGLE_TOP) – codeScriber

+0

to moja własna odpowiedź ok? – breceivemail

21

Możesz zadzwonić do odbiornika z twoja aktywność. Jeśli nie chcesz dodawać logiki odbiornika do swojej aktywności, możesz użyć odbiornika abstrakcyjnego.

Ty streszczenie odbiornik:

public abstract class SmsReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
      //Add you receiver logic here 
      ... 
      ... 
      onNewPosition(); 
     } 

    protected abstract void onNewPosition(); 

} 

W swojej działalności:

public class MyActivity extends Activity { 

    private smsReceiver smsReceiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map_one_position); 
     smsReceiver = new smsReceiver() { 

      // this code is call asyncrously from the receiver 
      @Override 
      protected void onNewPosition() { 
      //Add your activty logic here 
      } 

     }; 
     IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 
     intentFilter.setPriority(999); 
     this.registerReceiver(smsReceiver, intentFilter); 

    } 

    @Override 
     protected void onPause() { 
      super.onPause(); 
      this.unregisterReceiver(this.smsReceiver); 
     } 

} 

Mam nadzieję, że to pomoże ...

+8

Jak utworzyć instancję klasy abstrakcyjnej? –

+0

odbiornik transmisji nie może być utworzony prawidłowo? – ralphgabb

Powiązane problemy