onActivityResult для Intent(Settings.ACTION_SETTINGS) вызывается немедленно

На моем экране-заставке у меня есть запрос к серверу, но когда нет подключения к Интернету, я открываю

Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS);
startActivityForResult(settingsIntent, REQUEST_ENABLE_CONNECTION);

Но проблема в том, что onActivityResult вызывается сразу с requestCode = REQUEST_ENABLE_CONNECTION

Я также безуспешно пытался добавить флаг FLAG_NEW_TASK для намерения.

Действие не singleTop или singleInstance в manifest.

Какое лучшее решение для Android для решения этой проблемы? Я не хочу использовать Broadcast, так как это не лучший способ для моего потока, поэтому он будет выбран для меня как последний выбор.

Большое спасибо за помощь.


person Udi Oshi    schedule 02.04.2014    source источник
comment
Какой код результата вы получаете в onActivityResult? RESULT_CANCEELLED или что-то еще?   -  person andyandy    schedule 02.04.2014
comment
RESULT_CANCELED, но это не имеет большого значения, потому что вызывается onActivityResult, и при возврате в приложение с помощью кнопки «Назад» он больше не вызывается   -  person Udi Oshi    schedule 02.04.2014


Ответы (5)


Если onActivityForResult у вас не работает (как предложил @CommonsWare, все в порядке), вы можете создать простой поток, который должен работать нормально:

В своей деятельности добавьте

private boolean isReturnedFromSettings = false;

Когда вы решите, что нет подключения к Интернету и хотите открыть действие настроек, используйте startActivity и установите isReturnedFromSettings = true;

В onResume вашей деятельности добавьте следующее:

if (isReturnedFromSettings) {
isReturnedFromSettings = false;

//DO WHATEVER
}

Должно сработать...

person Lior Iluz    schedule 02.04.2014
comment
Этот флаг необходимо сохранить в onSaveInstanceState и onRestoreInstanceState, потому что вы можете потерять его, если система убьет ваш Activity при открытом экране настроек. - person Bartek Lipinski; 15.06.2019

Какое лучшее решение для Android для решения этой проблемы?

Нет проблем. Действия приложения настроек не задокументированы для поддержки startActivityForResult(), а основное действие (Settings.ACTION_SETTINGS) вообще не предлагает этого.

person CommonsWare    schedule 02.04.2014

Добавьте это к своему намерению:

 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
person Eric Segovia    schedule 16.01.2017

Я нашел обходной путь: в моем намерении

activity.startActivityForResult(intent,REQUEST_SYSTEM_WRITE_PERMISSION);
testDelaydRingtoneSetting(mUri, mCallback);

а тут прикол:

private void testDelaydRingtoneSetting(Uri mUri, KrollFunction mCallback) {
        final Uri ringtoneUri = mUri;
        final KrollFunction callback = mCallback;
        final Context context = TiApplication.getInstance().getApplicationContext();
        new android.os.Handler().postDelayed(new Runnable() {
        public void run() {
            if (Settings.System.canWrite(context)) {
                Activity activity = TiApplication.getInstance()
                        .getCurrentActivity();
                activity.finishActivity(REQUEST_SYSTEM_WRITE_PERMISSION);
                setRingtone(ringtoneUri, callback);
            } else
                testDelaydRingtoneSetting(ringtoneUri, callback);
        }
    }, 1000);
}
person Rainer Schleevoigt    schedule 25.06.2016

Пожалуйста, попробуйте это. Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS); startActivity(settingsIntent);

person User10001    schedule 02.04.2014
comment
Мне нужно вернуться к своей деятельности должным образом, чтобы спросить, есть ли подключение к устройству, это совсем не хорошо для меня. - person Udi Oshi; 02.04.2014
comment
что это значит? ...пожалуйста, объясните, почему вы этого не делаете. вы можете проверить (устройство имеет соединение) в методе onResume Activity. - person User10001; 02.04.2014