użyj startActivityForResult z non-activity

82

Mam MainActivity, która jest aktywnością i inną klasą (która jest prostą klasą Java), nazwiemy to „SimpleClass”. teraz chcę uruchomić z tej klasy polecenie startActivityForResult.

teraz myślę, że mogę przekazać tę klasę (SimpleClass), tylko kontekst MainActivity, problem polega na tym, że nie można uruchomić context.startActivityForResult (...);

więc jedynym sposobem, aby SimpleClass używał 'startActivityForResult; polega na przekazaniu odwołania do MainActivity jako zmiennej Activity do SimpleClass, coś takiego:

wewnątrz klasy MainActivity tworzę instancję SimpleClass w ten sposób:

SimpleClass simpleClass=new SimpleClass(MainActivity.this);

teraz tak wygląda SimpleClass:

public Class SimpleClass {

Activity myMainActivity;

   public SimpleClass(Activity mainActivity) {
       super();
       this.myMainActivity=mainActivity;    
   }
....


    public void someMethod(...) {
        myMainActivity.startActivityForResult(...);
    }

}

teraz działa, ale czy to nie jest właściwy sposób? Obawiam się, że w przyszłości może dojść do wycieków pamięci.

dzięki. promień.

Rayman
źródło
Nie wiem, co próbujesz zrobić, ale powinieneś to przeczytać .
Macarse
1
Czy robiąc to, możesz użyć onActivityResultmetody wewnątrz swojej simpleClass, czy nie zamierzałeś? Ten sam problem tutaj ..
Vivere_FlowCoder

Odpowiedzi:

64

Nie wiem, czy to dobra praktyka, czy nie, ale casting a Context object to an Activity objectkompiluje się dobrze.

Spróbuj tego:

if (mContext instanceof Activity) {
        ((Activity) mContext).startActivityForResult(...);
} else {
        Log.e("mContext should be an instanceof Activity.");
} 

Powinno się to skompilować, a wyniki powinny zostać przekazane do rzeczywistego działania trzymającego kontekst.

Jakiś student Noob
źródło
A co z tym, że kontekst jest przekazywany z usługi?
Madhur Ahuja
9
Nie, uruchamia wyjątek rzutowania!
Lisa Anne,
1
Kontekst nie jest nieuchronnie działaniem (na przykład, jeśli się z nim łączymyActivity.getApplicationContext()
Hugo Gresse
Jeśli celem jest uniknięcie wycieku pamięci, jaką korzyść ma utrzymywanie kontekstu jako zmiennej składowej klasy w porównaniu z utrzymywaniem działania? Czy przechowywanie kontekstu nie ma takiego samego potencjału, aby doprowadzić do wycieku pamięci, co przechowywanie działania?
stevehs17
4

Jeśli chcesz uzyskać wynik z poprzedniego działania, Twoja klasa wywołująca musi być typu Activity.

Jaki jest cel dzwonienia, Activity.startActivityForResult()jeśli nigdy nie użyjesz wyniku (przynajmniej zgodnie z przesłanym przykładowym kodem).

Czy myMainActivitycoś wpływa na wynik? Jeśli tak, po prostu utwórz SimpleClasspodklasę Activity i obsłuż wynik z SimpleClasssiebie.
Jeśli myMainActivitypotrzebujesz wyniku, może powinieneś refaktoryzować kod, od którego rozpocznie się działanie myMainActivity.

codinguser
źródło
2
Używam wyniku, po prostu chcę oddzielić go do innej klasy, więc zastanawiałem się, jak przekazać parametr Activity do klasy niebędącej aktywnością, bez powodowania wycieków w przyszłości.
rayman
1
A co z utworzeniem klasy SimpleClass zagnieżdżonej?
codinguser
0

Lepszym rozwiązaniem jest:

  1. Tworzenie SimpleClasspodklasy Twojej Activityklasy
  2. nazywając inne działanie jako startActivityForResult
  3. zajmowanie się wynikiem w SimpleClasssobie
gtiwari333
źródło
3
brzmi tak, że powinno działać, ale mam to:java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
Chłopak