Теперь я использую случайные числа для кодов запросов. Поэтому каждый раз, когда я добавляю новую активность для startActivityForResult, мне нужно проверить все другие подобные действия, чтобы избежать столкновений. Могут ли быть какие-либо методы определения ценностей, не подлежащих разметке по дизайну? Как вы думаете?
Существуют ли какие-либо рекомендации для значений кодов запросов в Android?
Ответ 1
Если вам все еще нужно проверить результат активности и как визуально отполированные структуры, пожалуйста, проверьте этот метод.
Объявите внутренний класс внутри вашего класса активности:
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) {
//...
}
}
Ответ 2
На самом деле вам не нужно проверять все ваши действия, и это не имеет большого значения, если у вас одинаковые значения в разных действиях.
Идея для кодов запросов заключается в том, что вы в своем действии X в onActivityResult()
можете различать результаты различных запросов, которые вы начали с startActivityForResult()
.
Итак, если у вас есть 3 разных вызова startActivityForResult()
в вашей деятельности, вам понадобятся 3 разных кода запроса, чтобы иметь возможность различать их в onActivityResult()
- чтобы вы могли определить, к какому результату принадлежит начало. Но если у вас есть другое действие Y, в котором вы делаете что-то похожее, не имеет значения, когда коды запросов там же, что и в Activity X.
Ответ 3
Приращение числа гарантируется, что он будет беспорядочным (пока он не обернется). На самом деле не произойдет, если вы не используете их много.
Вы можете добавить класс в свой проект, который даст вам номер. Например
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:
), потому что коммутатору нужны номера, которые известны во время компиляции