Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call startactivityforresult from a non-activity class to get the resuts

Is it possible to call startActivityForResult() from a non-activity class to get the results?

Scenario is something like this:

I have a class NonActivity (it doesn't derive from Activity as its not a UI). This class will have bunch of functions(steps basically) to run. One of the steps requires to show UI(Activity) and then get the result (user enter something). Then been able to use that data in next following steps.

How can this be achieved without deriving from activity class as I don't have UI component? Also since I don't want to derive from activity class that means I cannot override OnActivityResult(). Where results actually come from?

like image 739
user1950373 Avatar asked Jan 10 '13 19:01

user1950373


People also ask

How can I get result of startActivityForResult?

The android startActivityForResult method, requires a result from the second activity (activity to be invoked). In such case, we need to override the onActivityResult method that is invoked automatically when second activity returns result.

How do you call a startActivity from a non activity class?

public Context call mcontext;<br> // ..... <br> Intent intent = new Intent(call mcontext, AboutActivity. class);<br> call mcontext. startActivity(intent);

What can I use instead of startActivity for results?

We use startActivityForResult() to send and receive data between activities, in almost of our android projects. But recently startActivityForResult() method is deprecated in AndroidX. Android came up with ActivityResultCallback (also called Activity Results API) as an alternative for it.

Can we call startActivityForResult from adapter?

Yes. You can call startactivityforresult() from adapter. There are two case- 1. Calling adapter from activity and need onActivityResult in activity.


1 Answers

startActivityForResult() is only available from real on-screen activities, since it is a method in, well, Activity. Please redesign your application so that the user interface is driven from activities.

On the other hand, if your non Activity class is initialized and used from an onscreen Activity, you could pass that instance of the Activity to your class as a parameter in the constructor and use it to launch other Activities.

Be careful though. Using this method increases the risk of a memory leak, as the external class (Utils in my example) might keep a reference to the Activity even after its gone.

If all you want to do is access data, then you could try writing it to SharedPreferences or a Database or some files and then using the application context (passed in via a constructor again) to read it. This reduces the risk of a memory leak. Something like:

MyApiClass myApiClass = new MyApiClass(getApplicationContext());

EXAMPLE CODE

Main Activity:

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 class (which launches for result):

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);

    }

}

Test Activity:

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();

    }

}
like image 150
Raghav Sood Avatar answered Sep 22 '22 16:09

Raghav Sood