Napisałem aplikację, która ma <intent-filter/>, aby inne aplikacje mogły ją uruchamiać za pomocą startActivityForResult(). Po zakończeniu tej czynności utworzył obiekt, który wygląda następująco:

(Aplikacja A)

 public class MyObject implements Serializable {
      private String name;
      private String[] items
 }

I ustaw to na wynik:

(Aplikacja A)

 getIntent().putExtra("Extra_MyObject", myObject);
 setResult(RESULT_OK, getIntent());

Tak więc druga aktywność, która odbiera tę intencję, ma problem: skąd zna nazwę dodatkowej intencji do otrzymania i jak mam utworzyć otrzymany obiekt i przesłać go z powrotem do MyObject, który nie jest częścią tej aplikacji?

(Aplikacja B)

  @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == MY_REQ_CODE){
        if(resultCode == RESULT_OK){
                 // So here how do I know what the intent data name is i.e. "Extra_MyObject"
                 // and how would I know the structure to cast the object back to a MyObject that isn't part of this project?

        }
    }
}

Czy po prostu naśladuję klasę MyObject w drugiej aplikacji i rzutuję ją na nią? czy są inne opcje?

2
Blundell 4 marzec 2012, 19:38

2 odpowiedzi

Najlepsza odpowiedź

Możesz użyć biblioteki takiej jak Jackson do serializacji obiektu do ciągu JSON, który następnie deserializujesz na drugim końcu .

Jest znacznie bardziej elastyczny i wyeliminuje problem przekazywania niespójnych wersji Twoich danych, jeśli zdecydujesz się dodać np. dodatkowe pole.

Ponadto te dwie aplikacje nie muszą już utrzymywać klasy w tej samej przestrzeni nazw ani nawet nazywać ich tą samą nazwą.

I na koniec, nie musisz już publikować słoika, wystarczy tylko twoja dokumentacja.

3
Savvas Dalkitsis 4 marzec 2012, 20:08

skąd zna nazwę dodatkowego zamiaru do otrzymania?

Czytając dokumentację API opublikowaną przez autora pierwszej aplikacji.

jak utworzyć otrzymany obiekt i przerzucić go z powrotem do MyObject, który nie jest częścią tej aplikacji?

Autorzy pierwszej aplikacji musieliby również opublikować plik JAR zawierający implementację MyObject, który autorzy drugiej aplikacji dodają do swojego projektu. A autorzy pierwszej aplikacji albo nigdy nie musieliby zmieniać MyObject, albo przynajmniej upewniać się, że wersjonowanie serializacji działa.

Czy po prostu naśladuję klasę MyObject w drugiej aplikacji i rzutuję ją na to?

Jeśli przez „naśladować” masz na myśli „masz klasę z dokładnie taką samą nazwą klasy, dokładnie taką samą nazwą pakietu i dokładnie taką samą logiką serializacji”, to tak, chociaż jestem wtedy zaniepokojony użyciem terminu „tylko”. :-)

Jeśli MyObject ma strukturę, którą opisujesz, rozważ po prostu umieszczenie String i String[] jako osobnych dodatków lub umieść je w Bundle i użyj tego jako dodatku, aby uniknąć próbuje użyć niestandardowych obiektów Parcelable między aplikacjami.

1
CommonsWare 4 marzec 2012, 19:51