31

现在我使用随机数作为请求代码。因此,每次我为 startActivityForResult 添加新活动时,我都需要检查所有其他此类活动以避免冲突。可能有任何定义价值的实践,不可碰撞的设计?你怎么看?

4

3 回答 3

30

实际上,您不需要检查所有活动,如果您在不同活动中具有相同的值也没关系。

请求代码的想法是,您可以在 Activity X 中onActivityResult()区分您开始使用的不同请求的结果startActivityForResult()

因此,如果您startActivityForResult()的活动中有 3 个不同的调用,则需要 3 个不同的请求代码才能区分它们onActivityResult()- 这样您就可以分辨出哪个结果属于哪个start。但是,如果你有另一个活动 Y,你正在做类似的事情,那么当请求代码与活动 X 中的相同时,这并不重要。

于 2012-11-01T16:24:15.910 回答
9

增加一个数字保证不会发生冲突(直到它换行)。除非您大量使用它们,否则实际上不应该发生。

您可以在项目中添加一个为您提供编号的类。例如

public class GlobalStuff {
    private static final AtomicInteger seed = new AtomicInteger();
    public static int getFreshInt() {
        return seed.incrementAndGet();
    }
}

现在在您的代码中,每当您需要使用数字而不是

public void doSomething() {
    startActivityForResult(intentA, 342);
}

做它喜欢

private static final int REQUEST_CODE = GlobalStuff.getFreshInt();
public void doSomething() {
    startActivityForResult(intentA, REQUEST_CODE);
}

并且您不会两次使用相同的号码是安全的。至少当代码在同一个进程中运行时。

唯一的问题是您不能在switch语句中使用这些数字(如case REQUEST_CODE:),因为 switch 需要在编译时已知的数字

于 2012-11-01T15:11:10.350 回答
9

如果您仍然需要检查活动的结果并且喜欢视觉上抛光的结构,请检查此方法。

在活动类中声明内部类:

class RequestCode {
    static final int IMPORT = 100;
    static final int WRITE_PERMISSION = 101;
}

开始活动时使用代码:

startActivityForResult(intent, RequestCode.IMPORT);

检查结果:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RequestCode.IMPORT && resultCode == RESULT_OK) {
        //...
    }
}
于 2017-04-13T12:23:58.513 回答