Verwenden Sie startActivityForResult aus Nichtaktivität

80

Ich habe MainActivity, eine Aktivität, und eine andere Klasse (eine einfache Java-Klasse), wir nennen sie "SimpleClass". Jetzt möchte ich von dieser Klasse aus den Befehl startActivityForResult ausführen.

Jetzt denke ich, dass ich diese Klasse (SimpleClass) übergeben könnte, nur der Kontext von MainActivity. Das Problem ist, dass Sie context.startActivityForResult (...) nicht ausführen können.

Die einzige Möglichkeit für SimpleClass, 'startActivityForResult' zu verwenden. ist, die Referenz von MainActivity als Aktivitätsvariable an die SimpleClass zu übergeben:

Innerhalb der MainActivity-Klasse erstelle ich die Instanz von SimpleClass folgendermaßen:

SimpleClass simpleClass=new SimpleClass(MainActivity.this);

So sieht SimpleClass nun aus:

public Class SimpleClass {

Activity myMainActivity;

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


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

}

Jetzt funktioniert es, aber ist das nicht der richtige Weg, dies zu tun? Ich fürchte, ich könnte in Zukunft einige Speicherlecks haben.

Vielen Dank. Strahl.

Rayman
quelle
Ich weiß nicht , was Sie versuchen zu tun , aber Sie sollten lesen diese .
Macarse
1
onActivityResultKönnten Sie auf diese Weise die Methode in Ihrer simpleClass verwenden oder wollten Sie das nicht? Gleiches Problem hier ..
Vivere_FlowCoder

Antworten:

63

Ich weiß nicht, ob dies eine gute Praxis ist oder nicht, aber casting a Context object to an Activity objectkompiliert gut.

Versuche dies:

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

Dies sollte kompiliert werden und die Ergebnisse sollten an die tatsächliche Aktivität geliefert werden, die den Kontext enthält.

Ein Noob-Student
quelle
Wie wäre es, wenn der Kontext von einem Dienst übergeben wird?
Madhur Ahuja
9
Nein, es wird eine Besetzungsausnahme ausgelöst!
Lisa Anne
1
Ein Kontext ist nicht zwangsläufig eine Aktivität (zum Beispiel, wenn es darum gehtmyActivity.getApplicationContext()
Hugo Gresse
Wenn das Ziel darin besteht, einen Speicherverlust zu vermeiden, welchen Vorteil hat das Halten eines Kontexts als Mitgliedsvariable einer Klasse gegenüber dem Halten einer Aktivität? Hat das Speichern eines Kontexts nicht das gleiche Potenzial, zu einem Speicherverlust zu führen wie das Speichern einer Aktivität?
stevehs17
4

Wenn Sie das Ergebnis der vorherigen Aktivität erhalten möchten, muss Ihre aufrufende Klasse vom Typ Aktivität sein.

Was ist der Zweck Ihres Anrufs, Activity.startActivityForResult()wenn Sie das Ergebnis nie verwenden (zumindest gemäß dem von Ihnen veröffentlichten Beispielcode) ?

Hat myMainActivityetwas mit dem Ergebnis zu tun? Wenn ja, dann machen Sie einfach SimpleClasseine Unterklasse von Aktivität und behandeln Sie das Ergebnis aus SimpleClasssich heraus.
Wenn myMainActivitydas Ergebnis benötigt wird, sollten Sie möglicherweise den Code umgestalten, um die Aktivität zu starten myMainActivity.

Codierungsbenutzer
quelle
2
Ich verwende das Ergebnis, nur möchte ich es in eine andere Klasse aufteilen, also habe ich mich gefragt, wie ich einen Aktivitätsparameter an eine Nicht-Aktivitätsklasse übergeben soll, ohne in Zukunft Lecks zu verursachen.
Rayman
1
Wie wäre es, SimpleClass zu einer verschachtelten Klasse zu machen?
Codinguser
0

Bessere Lösung ist:

  1. Erstellen Sie SimpleClasseine Unterklasse Ihrer ActivityKlasse
  2. Aufruf einer anderen Aktivität als startActivityForResult
  3. das Ergebnis in sich SimpleClassselbst behandeln
gtiwari333
quelle
3
klingt so, als ob das funktionieren sollte, aber ich habe folgendes:java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
Junge