onActivityResult outside of an activity scope

Nitzan Tomer picture Nitzan Tomer · Oct 4, 2011 · Viewed 7k times · Source

I'm trying to create an android project that contains shared code which will be used by others. In this project I only have POJO and no android specific classes.

Some of the functionality requires calling some activities and is depended on the result. My POJO classes get reference to the calling activity when used, but that's happening at run time and I have no control over the implementation of those activities.

My problem is that with the reference of the calling activity I can startActivityForResult but I have no way of adding the onActivityResult, which might exists in the calling activity but is not aware of the requestCode I used.

My question then is how do I know, from within a regular java object when the activity has returned? since, as far as I understand I can only implement onActivityResult on Activity classes.

thanks!

Answer

Szabolcs Berecz picture Szabolcs Berecz · Oct 4, 2011

You will have quite a few problems with this setup, but this is how you might want to get started:

You will have to include an activity in your project which does nothing else than starting the activity you want to get the result from and stores it in a globally accessible storage (e.g. a singleton or a static field).

class Pojo {
    static final ConditionVariable gate = new ConditionVariable();
    static int result;

    int m(Context context) {
        context.startActivity(new Intent(context, ForwarderActivity.class));
        gate.block();
        return result;
    }
}

class ForwarderActivity extends Activity {
    private boolean started = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!started) {
            started = true;
            startActivityForResult(new Intent("ContactsProvider"), 1);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Pojo.result = resultCode;
        Pojo.gate.open();
    }
}

There are a couple of problems, though. Like your POJO's method can't be called from the main (UI) thread, because you need to convert an asynchronous call (startActivityForResult()) to a synchronous one (Pojo.m()) and the activity you want to receive info from will be started on the main thread, so you can't block it in Pojo.m()...

Anyway, the code does not work, but you can see which way to go if you really have to stick with this setup. But you should really try to come up with some other means of fetching the data, like a content provider.