2012-04-06 28 views
8

Mam 2 czynności, każda w osobnych aplikacjach. Activity1 posiada przycisk użytkownik może kliknąć i wywołuje drugą aktywność przy użyciu intencji w onClick() metody:Android onActivityResult o nazwie early

Intent myIntent = getPackageManager().getLaunchIntentForPackage(com.myProject.Activity2); 
startActivityForResult(myIntent, 600); 

to poprawnie uruchamia Activity2 z Activity1, ale onActivityResult jest wywoływana w Activity1 przed onCreate jest wywoływana w Activity2, zamiast z onBackPressed() gdzie skonfigurowałem zamiar powrotu.

Oto metoda onCreate dla Activity2:

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

Oto aktualna wersja onBackPressed sposobu Activity2:

@Override 
public void onBackPressed() { 
    Intent intent = new Intent(); 
    intent.putExtra("Stuff", someStuff); 

    if(getParent()==null){ 
     setResult(Activity.RESULT_OK, intent); 
    }else{ 
     getParent().setResult(Activity.RESULT_OK, intent); 
    } 
    finish(); 
    super.onBackPressed(); 
} 

My AndroidManifest.xml ma następujący filtr intencyjny Activity2:

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

Potwierdziłem, że moja launchMode jest standard (i nie singleTask, itp.) Zgodnie z zaleceniami here, a mój kod żądania nie jest ujemny w postaci ostrzeżenia here. Próbowałem też android:launchMode="singleTop", ale to też nie było.

Próbowałem też niestawienie finish() w onBackPressed() dla Activity2 jak wspomniano here (również tylko super.onBackPressed() jako sugerowanej here) i ponownie nazywając go jak sugeruje here.

Dodatkowo próbowałem skomentować linię intent.putExtra("Stuff", someStuff);, ponieważ wydawało się, że powoduje problemy dla this person.

Jakieś pomysły dotyczące tego, co robię źle?

Odpowiedz

9

Więc tutaj jest ostatecznym rozwiązaniem, które zadbał o nim:

zmieniłem zamiar za Activity1 na następujące kwestie:

Intent myIntent = new Intent(); 
myIntent.setClassName("com.myProject", "com.myProject.Activity2"); 
startActivityForResult(myIntent, 600); 

Z jakiegoś powodu Android wymaga pełną nazwę dla drugiego parametru oprócz nazwy pakietu podanej przez pierwszy parametr. Teraz działa! :)

+1

Dziękuję bardzo za odesłanie i opublikowanie rozwiązania. Utknąłem na tym problemie od dłuższego czasu i ja też wypróbowałem wszystkie rozwiązania, które spotkałeś w swoim pytaniu, bez skutku. To naprawiło to i sprawiło, że mój dzień był o wiele lepszy =) –

+0

Używam startActivityForResult BEO setClassName lub w pełni kwalifikowanych nazw na wszystkich moich projektach i wszystkie działają doskonale, z wyjątkiem jednego przypadku. Więc wypróbowałem twoje rozwiązanie w tym przypadku i nie miało to żadnego znaczenia. – user316117

+0

2h !! Bardzo dziękuję za rozwiązanie – Anthone

0

Nie jestem pewien, jaki masz problem. Sposób, w jaki tworzysz intencję w działaniu1, jest nieparzysty; ta metoda nie służy do tworzenia intencji, które uruchamiają inną aktywność w tej samej aplikacji. Niektórzy programiści używają konstruktora Intent (Context, Class <>). Wolę używać funkcji Intent (akcja String) z niestandardowym ciągiem akcji zdefiniowanym tylko w mojej aplikacji (co ułatwia łatwiejszy kod).

Ponadto filtr zamiany określony dla działania 2 jest zwykle używany do działania uruchamianego bezpośrednio z ekranu głównego.

Gdzie jest kod onCreate() dla działania2? Gdzie jest kod dla onBackPressed()? Czy możesz mi udowodnić, że setResult() jest wywoływana przed jakimś innym kodem w Activity2? Powinieneś uruchomić działania w debugowaniu. Upewnij się, że Activity2 otrzymuje zamierzone działanie, a następnie śledź krok po kroku instrukcje wykonywane do setResult(). Rzeczą, którą należy wykonać, jest wyrzucanie rozwiązań za pomocą kodu, zanim zrozumiesz, jaki jest podstawowy problem.

O ile wiem, jak dotąd, Activity1 wysyła intencję, a następnie wywołuje onActivityResult. Nic więcej nie udowodniono do tej pory.

+0

Dzięki za komentarz - dodałem do pytań metody "onCreate" i "onBackPressed". Przeprowadziłem debugowanie wiele razy i używając punktów przerwania byłem w stanie pokazać, że Activity1 'onActivityResult' jest wywoływany, gdy Activity2 jest uruchamiany po raz pierwszy - zanim Activity2 kiedykolwiek powróci i nie zostanie ponownie wywołany, gdy wróci. – user1205577

+0

Próbowałem także utworzyć intencję za pomocą 'Intent (context, Activity2.class)', ale skarżyło się, że nie może znaleźć klasy (prawdopodobnie dlatego, że jest w innej aplikacji). Próbowałem kilku wariantów użycia w pełni kwalifikowanej nazwy ścieżki, co również nie było możliwe. – user1205577

1

Stanie się to, jeśli flaga "singleInstance" zostanie ustawiona po uruchomieniu działania.

+0

Dzięki jbaylina Twoja odpowiedź jest dla mnie pomocna – Swapnil

Powiązane problemy