为什么 startActivityForResult 不使用回调或更高级别的方式返回结果?

Eug*_*ace 5 android android-activity

我是 Android 新手,所以我可能会遗漏一些东西。我正在编写一个“登录”活动。Activity 返回安全令牌供应用程序稍后使用。

一切正常。我不太喜欢的是用于返回结果的协议:

本质上,我的登录活动是这样使用的:

...
        login = (Button) findViewById(R.id.login);
        login.setOnClickListener(new View.OnClickListener()
        {
        public void onClick(View v)
        {
            Intent authActivity = new Intent(context,
                                             AuthenticationActivity.class);

            authActivity.putExtra("clientId","MY CLIENT ID");

            startActivityForResult(authActivity, AuthenticationActivity.AUTH_REQUEST_COMPLETE);
        }
    });
Run Code Online (Sandbox Code Playgroud)

然后,我通过onActivityResult方法检索结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent authActivityResult) {
    super.onActivityResult(requestCode, resultCode, authActivityResult);

    switch(requestCode)
    {
        case AuthenticationActivity.AUTH_REQUEST_COMPLETE:
            if(resultCode==RESULT_OK)
            {
               access_token =authActivityResult.getStringExtra(AuthenticationActivity.ACCESS_TOKEN)); ...
Run Code Online (Sandbox Code Playgroud)

这是应该的方式吗?或者,还有更好的方法?例如,我想返回一个类型而不是使用属性包。这有很多优点(例如更容易重构、编译时检查等)

粗略地说,我想看到类似(伪代码)的东西:

 startActivityForResult<MyResult>(authActivity, new OnResultHandler() { 
      @Override
      void HandleResult( MyResult r )
      {
         ....
      }
  });
Run Code Online (Sandbox Code Playgroud)

很想听听 Android 专家的看法!

Dav*_*ser 3

我确信我们在 Android 中都会遇到一些我们会以不同方式完成的事情。所有操作系统、编程语言、政治体系、经济体系、宗教等都是如此。

然而,如果你想为 Android 编程,你几乎只能使用现有的东西。

要回答您的问题,您不必使用“属性包”将内容返回到调用活动。您可以将任何您想要的对象作为额外的内容放入返回中Intent,只要它实现ParcelableSerializable

例如,假设MyResultImplements Parcelable,您AuthenticationActivity可以返回如下结果:

Intent resultIntent= new Intent();
resultIntent.putExtra(RESULT, myResult);
setResult(RESULT_OK, resultIntent);
finish();
Run Code Online (Sandbox Code Playgroud)

调用活动可以MyResult像这样提取:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent authActivityResult) {
    super.onActivityResult(requestCode, resultCode, authActivityResult);
    switch(requestCode)
    {
        case AuthenticationActivity.AUTH_REQUEST_COMPLETE:
            if(resultCode==RESULT_OK)
            {
                MyResult result = authActivityResult.getParcelableExtra(AuthenticationActivity.RESULT));
Run Code Online (Sandbox Code Playgroud)

现在你有了一个MyResult可以做任何你想做的事情的对象。