startActivityForResult()
アクティビティのメソッドであるため、実際の画面上のアクティビティからのみ使用できます。ユーザー インターフェイスがアクティビティから駆動されるように、アプリケーションを再設計してください。
一方、Activity 以外のクラスが初期化され、画面上の Activity から使用される場合、その Activity のインスタンスをコンストラクターのパラメーターとしてクラスに渡し、それを使用して他の Activity を起動できます。
ただし、注意してください。このメソッドを使用すると、メモリ リークのリスクが高まります。これは、外部クラス (私の例では Utils) が、削除された後もアクティビティへの参照を保持する可能性があるためです。
データにアクセスしたいだけなら、それを SharedPreferences または Database またはいくつかのファイルに書き込んでから、アプリケーション コンテキスト (コンストラクターを介して再度渡される) を使用して読み取ることができます。これにより、メモリ リークのリスクが軽減されます。何かのようなもの:
MyApiClass myApiClass = new MyApiClass(getApplicationContext());
サンプルコード
主な活動:
public class Main extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Utils util = new Utils(this);
util.startTest();
}
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
Toast.makeText(this, "onActivityResult called", Toast.LENGTH_LONG).show();
super.onActivityResult(arg0, arg1, arg2);
}
}
Utils クラス (結果のために起動します):
public class Utils {
Activity activity;
public Utils(Activity ac) {
activity = ac;
}
public void startTest() {
Intent i = new Intent(activity, Test.class);
activity.startActivityForResult(i, 1);
}
}
テスト活動:
public class Test extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toast.makeText(this, "Test", Toast.LENGTH_LONG).show();
this.setResult(Activity.RESULT_OK);
this.finish();
}
}