非アクティビティからstartActivityForResultを使用します


82

アクティビティであるMainActivityと他のクラス(単純なJavaクラス)があります。これを「SimpleClass」と呼びます。そのクラスからコマンドstartActivityForResultを実行したいと思います。

今、私はそのクラス(SimpleClass)を渡すことができましたが、MainActivityのコンテキストのみ、問題は、context.startActivityForResult(...);を実行できないことです。

したがって、SimpleClassで 'startActivityForResultを使用する唯一の方法。MainActivityの参照をActivity変数としてSimpleClassに次のように渡すことです。

MainActivityクラス内で、SimpleClassのインスタンスを次のように作成します。

SimpleClass simpleClass=new SimpleClass(MainActivity.this);

SimpleClassは次のようになります。

public Class SimpleClass {

Activity myMainActivity;

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


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

}

現在は機能していますが、これを行う適切な方法ではありませんか?将来、メモリリークが発生する可能性があります。

ありがとう。レイ。


私はあなたがやろうとしているのか分からないが、あなたが読むべき本を
マッカース2010年

1
これを行うことでonActivityResult、simpleClass内のメソッドを使用できますか、それとも意図していませんでしたか?ここでは、同じ問題...
Vivere_FlowCoder

回答:


64

これが良い習慣かどうかはわかりませんが、casting a Context object to an Activity object正常にコンパイルされます。

これを試して:

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

これをコンパイルし、結果をコンテキストを保持する実際のアクティビティに配信する必要があります。


コンテキストがサービスから渡される場合はどうですか?
Madhur Ahuja 2013年

9
いいえ、キャスト例外を起動します!
リサ・アン

1
コンテキストは必然的にアクティビティではありません(たとえば、それがうまくいく場合myActivity.getApplicationContext()
Hugo Gresse 2015年

目標がメモリリークを回避することである場合、アクティビティを保持するよりも、クラスのメンバー変数としてコンテキストを保持することにどのような利点がありますか?コンテキストを保存すると、アクティビティを保存するのと同じようにメモリリークが発生する可能性がありませんか?
stevehs17 2016

4

前のアクティビティから結果を取得する必要がある場合は、呼び出し元のクラスのタイプがアクティビティである必要があります。

Activity.startActivityForResult()結果を使用しない場合(少なくとも投稿したサンプルコードによると)、呼び出す目的は何ですか。

ないmyMainActivity結果で何かを?もしそうならSimpleClass、Activityのサブクラスを作成し、SimpleClassそれ自体の中から結果を処理します。結果が必要な
場合myMainActivityは、コードをリファクタリングしてからアクティビティを開始する必要がありますmyMainActivity


2
結果を使用していますが、それを別のクラスに分離したいので、将来リークを発生させずに、Activityパラメーターを非アクティビティクラスに渡す方法を考えていました。
レイマン2010年

1
SimpleClassをネストされたクラスにするのはどうですか?
codinguser

0

より良い解決策は:

  1. クラスのSimpleClassサブクラスを作成するActivity
  2. 別のアクティビティを startActivityForResult
  3. SimpleClassそれ自体の中で結果を処理する

3
これはうまくいくはずですが、私はこれを手に入れました:java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
Boy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.