FLAG_ACTIVITY_FORWARD_RESULT的使用

这是个很基础的知识点,然而,最近又被坑了一次。于是写个demo 巩固一下。

需求很简单,就是 从 Activity A跳到B,再从B跳到C,并且希望 A中可以直接拿到C返回的结果,而B只是起到一个过渡的作用。

Activity A-B-C的demo代码如下:

//Activity A
//A  startActivityForResult 想要从B 拿到结果
public class AAActivity extends AppCompatActivity {

    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = (Button) findViewById(R.id.btn);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(AAActivity.this, BBActivity.class);
                startActivityForResult(intent, 100);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.e("forwardresult","AAActivity requestCode:" + requestCode + ", resultCode:" + resultCode);
    }
}
//Activity B
//B 作为过渡页在跳转C时 添加了FLAG_ACTIVITY_FORWARD_RESULT flag 将会使 C返回的结果不经过B 而直接到A 
public class BBActivity extends Activity{

    private Button mButton;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bb);

        mButton = (Button) findViewById(R.id.btn);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(BBActivity.this, CCActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
                startActivity(intent);
            }
        });
    }
}
//Activity C
//C setResult给调用者
public class CCActivity extends Activity {

    private Button mButton;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cc);

        mButton = findViewById(R.id.btn);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setResult(RESULT_OK);
                finish();
            }
        });
    }
}

Intent.FLAG_ACTIVITY_FORWARD_RESULT 这个flag 不能和startActivityForResult 一起使用,否则会报android.util.AndroidRuntimeException: FORWARD_RESULT_FLAG used while also requesting a result, 也很好理解,FORWARD_RESULT_FLAG 就是希望 不接受返回结果,而startActivityForResult 是希望获取结果,相互矛盾。下面这样写法会crash

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(BBActivity.this, CCActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
                startActivityForResult(intent, 1000);
            }
        });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容