実行できるオプションの 1 つは、フォアグラウンド アクティビティを保持するメンバー変数を持つ、すべてのアクティビティが拡張される BaseActivity を持つことです。AsyncTask が終了したら、BaseActivity からの Activity 参照を使用して AlertDialog を表示できます。例えば:
ファイル: MyBaseActivity.java
public class MyBaseActivity extends Activity {
protected static Activity sForegroundActivity;
class MyAsyncTask extends AsyncTask<Object, Object, Object> {
@Override
protected Object doInBackground(Object... params) {
// do stuff
return null;
}
protected void onPostExecute(Object result) {
// cover the edge case where the AsyncTask finished while we are transitioning
// between activities and we have not set the foreground activity instance
if(sForegroundActivity == null) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(sForegroundActivity);
builder.setMessage("Showing Dialog in Foreground Activity");
builder.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// handle ok clicked
}
});
builder.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// handle cancel clicked
}
});
builder.create().show();
}
}
@Override
public void onStart() {
super.onStart();
sForegroundActivity = this;
}
@Override
public void onStop() {
super.onStop();
sForegroundActivity = null;
}
}
ファイル: ActivityA.java
public class ActvityA extends MyBaseActivity {
private void startAsyncTaskAndGoToActivityB() {
// start our AsyncTask
new MyAsyncTask().execute();
// go to ActivityB. When the AsyncTask finishes, the AlertDialog will be shown in ActivityB
Intent myIntent = new Intent(this, ActivityB.class);
startActivity(myIntent);
}
}