如何从非活动类调用startactivityforresult来获取resuts

use*_*373 13 android android-activity

是否可以startActivityForResult()从非活动类调用以获得结果?

场景是这样的:

我有一个类NonActivity(它不是从Activity派生的,因为它不是UI).这个类将有很多函数(基本上是步骤)来运行.其中一个步骤需要显示UI(Activity)然后获取结果(用户输入内容).然后能够在接下来的步骤中使用该数据.

如果没有派生活动类,如何实现这一点,因为我没有UI组件?此外,因为我不想从活动类派生,这意味着我无法覆盖OnActivityResult().结果究竟来自哪里?

Rag*_*ood 22

startActivityForResult()只能通过真实的屏幕活动获得,因为它是一种方法,以及活动.请重新设计您的应用程序,以便从活动中驱动用户界面.

另一方面,如果您的非Activity类已在屏幕上的Activity中初始化并使用,则可以将该Activity的实例作为构造函数中的参数传递给您的类,并使用它来启动其他活动.

但要小心.使用此方法会增加内存泄漏的风险,因为外部类(在我的示例中为Utils)可能会保留对Activity的引用,即使它已经消失.

如果您只想访问数据,那么您可以尝试将其写入SharedPreferences或数据库或某些文件,然后使用应用程序上下文(通过构造函数再次传入)来读取它.这降低了内存泄漏的风险.就像是:

MyApiClass myApiClass = new MyApiClass(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

示例代码

主要活动:

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

}
Run Code Online (Sandbox Code Playgroud)

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

    }

}
Run Code Online (Sandbox Code Playgroud)

测试活动:

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

    }

}
Run Code Online (Sandbox Code Playgroud)

  • @RaghavSood:是的我同意你的意见,我们必须覆盖Activity中的onActivityResult而不是非活动类作为OP要求 (2认同)

dan*_*117 7

使用没有可见GUI的片段的类中的StartActivityForResult.您可能会在实用程序类中找到类似的内容.

请参阅下面的runGetUserAccount.它创建自己的片段并执行startActivityForResult.然后它有自己的onActivityResult.

public class MyGooglePlay {

    private static final int CONNECTION_FAILURE_RESOLUTION_REQUEST = 31502;
    private ActionBarActivity activity;
    private FragmentManager fragManager;

    public MyGooglePlay(ActionBarActivity activity) {
        this.activity = activity;
        this.fragManager = activity.getSupportFragmentManager();
    }


     /**
     * Starts an activity in Google Play Services so the user can pick an
     * account
     */
    private String mEmail = "";
    static final int REQUEST_CODE_PICK_ACCOUNT = 1000;    
    public void runGetUserAccount() {
        if (TextUtils.isEmpty(mEmail)) {
            // run this code in gui less fragment so we can pickup the 
            // on activity result from inside the mygoogleplay class.
            Fragment f = new Fragment() {
                @Override
                public void onAttach(Activity activity) {
                    super.onAttach(activity);
                    String[] accountTypes = new String[] { "com.google" };
                    Intent intent = AccountPicker.newChooseAccountIntent(null,
                            null, accountTypes, false, null, null, null, null);
                    startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);
                }

                @Override
                public void onActivityResult(int requestCode, int resultCode,
                        Intent data) {
                    if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
                        if (resultCode == Activity.RESULT_OK) {
                            set_Email(data
                                    .getStringExtra(AccountManager.KEY_ACCOUNT_NAME));
                            // getUsername();
                        }
                    super.onActivityResult(requestCode, resultCode, data);
                }

                //this is to verify the fragment has been removed.
                //you can log or put a breakpoint to verify
                @Override public void onDestroy(){
                    super.onDestroy();
                }
            };
            FragmentTransaction fragmentTransaction = this.fragManager
                    .beginTransaction();
            fragmentTransaction.add(f, "getusername");
            fragmentTransaction.commit();
        }
    }

    /**
     * @param mEmail
     *            the mEmail to set
     */
    private void set_Email(String mEmail) {
        this.mEmail = mEmail;
        if (!TextUtils.isEmpty(mEmail)) {
            // TODO notify caller email is ready;
            // activity.onEmailReady(mEmail);
        }
        //we are done with the "getusername" fragment
        Fragment f = fragManager.findFragmentByTag("getusername");
        if (f!=null) {
            fragManager.beginTransaction().remove(f).commit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)