onActivityResult не вызывается для startActivityForResult

У меня есть MainActivity с меню параметров с пунктом «Настройки».

Когда я запускаю SettingsActivity, все работает нормально, пока я не нажму кнопку "Сохранить" и не попытаюсь закончить SettingsActivity. Это действие заканчивается, но, похоже, оно также закрывает родительское действие. Я работаю над этим в Eclipse. Eclipse говорит, что что-то все еще работает, потому что это позволяет мне нажать кнопку остановки. У меня есть поток таймера, работающий в MainActivity, но я протестировал его без этого потока, и он все еще не возвращается к onActivityResult().

Я запускаю SettingsActivity следующим образом:

public static final int ACTIVITY_CREATE = 1;

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.settings:
            try {
                Intent intent = new Intent(this, SettingsActivity.class);
                startActivityForResult(intent, ACTIVITY_CREATE);
            }
            catch (Exception e) {
                Log.e(TAG, e.getMessage());
                finish();
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Я ожидаю, что finish() в SettingsActivity приведет меня к этой функции, но это не так. У меня здесь установлена ​​точка останова, и она никогда сюда не попадает:

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

    switch (requestCode) {
        case (ACTIVITY_CREATE): {
            if (resultCode == RESULT_OK) {
            }
            break;
       }
    }
}

Вот простой SettingsActivity:

    public class SettingsActivity extends Activity implements View.OnClickListener {
    private Button save;

    @Override
        public void onCreate(Bundle b) {
            super.onCreate(b);
            setContentView(R.layout.settings);
            save = (Button) findViewById(R.id.save);
            save.setOnClickListener(this);
            return;
        }

    @Override
        public void onClick(View v) {

            switch (v.getId()) {
                case R.id.save:
                    Intent intent = new Intent();
                    intent.putExtra("ip", ipText.getText().toString());
                    setResult(RESULT_OK, intent);
                    finish();
                    break;

                default:
                    break;
            }

            return;
        }
}                              // public class SettingsActivity extends Activity {

LaunchMode для основного действия установлен на «стандартный».

Мой вопрос: почему я не возвращаюсь к onActivityResult() в вызывающей активности?

Спасибо, Боб

Вот файл манифеста:

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.MyStuff"
      android:versionCode="1"
      android:versionName="1.0">


    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity 
            android:name=".CTNet" 
            android:label="@string/app_name" 
            android:screenOrientation = "fullSensor"
            android:configChanges = "orientation|screenSize|keyboardHidden"   
            android:launchMode="singleTask"
        >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>




        <activity
            android:name=".SettingsActivity"
        >

        </activity>

    </application>

    <uses-sdk android:minSdkVersion="8" />                             <!-- after targetSdkVersion -->

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />

    <uses-feature android:glEsVersion="0x00020000" android:required="true" />

</manifest>

Попытка добавить подробный logcat здесь:

    06-30 12:18:58.292: I/System.out(16197): Sending WAIT chunk
06-30 12:18:58.292: W/ActivityThread(16197): Application com.MyStuff is waiting for the debugger on port 8100...
06-30 12:18:58.300: I/dalvikvm(16197): Debugger is active
06-30 12:18:58.495: I/System.out(16197): Debugger has connected
06-30 12:18:58.495: I/System.out(16197): waiting for debugger to settle...
06-30 12:18:58.698: I/System.out(16197): waiting for debugger to settle...
06-30 12:18:58.901: I/System.out(16197): waiting for debugger to settle...
06-30 12:18:59.097: I/System.out(16197): waiting for debugger to settle...
06-30 12:18:59.300: I/System.out(16197): waiting for debugger to settle...
06-30 12:18:59.503: I/System.out(16197): waiting for debugger to settle...
06-30 12:18:59.706: I/System.out(16197): waiting for debugger to settle...
06-30 12:18:59.901: I/System.out(16197): waiting for debugger to settle...
06-30 12:19:00.104: I/System.out(16197): waiting for debugger to settle...
06-30 12:19:00.307: I/System.out(16197): waiting for debugger to settle...
06-30 12:19:00.511: I/System.out(16197): debugger has settled (1476)
06-30 12:19:00.722: D/SOV(16197): MainActivity::onCreate
06-30 12:19:01.003: D/CTNet(16197): creating view
06-30 12:19:01.003: D/CTNet(16197): view created
06-30 12:19:01.065: I/System.out(16197): CTNet: starting
06-30 12:19:01.128: I/System.out(16197): BMA254 Acceleration Sensor
06-30 12:19:01.128: I/System.out(16197):    vendor = Bosch Sensortec
06-30 12:19:01.128: I/System.out(16197):    version = 42602
06-30 12:19:01.128: I/System.out(16197):    maximum range = 19.613300
06-30 12:19:01.136: I/System.out(16197):    min delay = 10000
06-30 12:19:01.136: I/System.out(16197):    power = 0.130000
06-30 12:19:01.136: I/System.out(16197):    resolution = 0.038307
06-30 12:19:01.136: I/System.out(16197):    type = 1
06-30 12:19:01.136: I/System.out(16197): MS-3E (YAS530) Magnetic Sensor
06-30 12:19:01.136: I/System.out(16197):    vendor = Yamaha Corporation
06-30 12:19:01.143: I/System.out(16197):    version = 42602
06-30 12:19:01.143: I/System.out(16197):    maximum range = 800.000000
06-30 12:19:01.143: I/System.out(16197):    min delay = 10000
06-30 12:19:01.143: I/System.out(16197):    power = 4.000000
06-30 12:19:01.143: I/System.out(16197):    resolution = 0.300000
06-30 12:19:01.143: I/System.out(16197):    type = 2
06-30 12:19:01.151: I/System.out(16197): MS-x Orientation Sensor
06-30 12:19:01.151: I/System.out(16197):    vendor = Yamaha Corporation
06-30 12:19:01.151: I/System.out(16197):    version = 42602
06-30 12:19:01.151: I/System.out(16197):    maximum range = 360.000000
06-30 12:19:01.151: I/System.out(16197):    min delay = 10000
06-30 12:19:01.151: I/System.out(16197):    power = 0.000000
06-30 12:19:01.151: I/System.out(16197):    resolution = 1.000000
06-30 12:19:01.151: I/System.out(16197):    type = 3
06-30 12:19:01.151: I/System.out(16197): AL3201 Light Sensor
06-30 12:19:01.151: I/System.out(16197):    vendor = LITEON
06-30 12:19:01.151: I/System.out(16197):    version = 42602
06-30 12:19:01.159: I/System.out(16197):    maximum range = 0.000000
06-30 12:19:01.159: I/System.out(16197):    min delay = 0
06-30 12:19:01.159: I/System.out(16197):    power = 0.000000
06-30 12:19:01.159: I/System.out(16197):    resolution = 0.000000
06-30 12:19:01.159: I/System.out(16197):    type = 5
06-30 12:19:01.159: I/System.out(16197): Auto Rotation Sensor
06-30 12:19:01.159: I/System.out(16197):    vendor = Samsung Electronics
06-30 12:19:01.159: I/System.out(16197):    version = 1
06-30 12:19:01.159: I/System.out(16197):    maximum range = 255.000000
06-30 12:19:01.159: I/System.out(16197):    min delay = 0
06-30 12:19:01.167: I/System.out(16197):    power = 0.000000
06-30 12:19:01.167: I/System.out(16197):    resolution = 0.000000
06-30 12:19:01.167: I/System.out(16197):    type = 15
06-30 12:19:01.167: E/SensorManager(16197): thread start
06-30 12:19:01.167: D/SensorManager(16197): registerListener :: handle = 1  name= BMA254 Acceleration Sensor delay= 200000  
06-30 12:19:01.253: D/CTNet(16197): onStart
06-30 12:19:01.261: D/CTNet(16197): onResume
06-30 12:19:01.487: D/SV(16197): surfaceCreated
06-30 12:19:01.487: D/SV(16197): surfaceChanged
06-30 12:19:08.190: W/Choreographer(16197): Already have a pending vsync event.  There should only be one at a time.
06-30 12:19:08.222: D/CTNet(16197): onPause
06-30 12:19:08.245: D/SensorManager(16197): unregisterListener::  
06-30 12:19:08.245: D/Sensors(16197): Remain listener = Sending .. normal delay 200ms
06-30 12:19:08.245: I/Sensors(16197): sendDelay --- 200000000
06-30 12:19:08.245: D/SensorManager(16197): JNI - sendDelay
06-30 12:19:08.245: I/SensorManager(16197): Set normal delay = true
06-30 12:19:08.323: E/ViewRootImpl(16197): sendUserActionEvent() mView == null
06-30 12:19:08.487: D/settings(16197): 192.168.1.200
06-30 12:19:08.487: D/settings(16197): 9072
06-30 12:19:08.979: D/SV(16197): surfaceDestroyed
06-30 12:19:09.089: D/CTNet(16197): onStop
06-30 12:19:10.682: D/settings(16197): save clicked
06-30 12:19:10.729: W/Choreographer(16197): Already have a pending vsync event.  There should only be one at a time.
06-30 12:19:10.948: W/IInputConnectionWrapper(16197): showStatusIcon on inactive InputConnection
06-30 12:19:11.104: D/SOV(16197): MainActivity::onDestroy

person user292344    schedule 30.06.2014    source источник
comment
код должен работать так, как вы разместили его здесь. Я предполагаю, что проблема где-то в другом месте, куда вы не смотрите (и мы не видим)   -  person NikkyD    schedule 30.06.2014
comment
где вы начинаете активностьForResult? внутри активности или внутри фрагмента?   -  person Lena Bru    schedule 30.06.2014
comment
вызывается onDestory для вызывающей активности?   -  person Lena Bru    schedule 30.06.2014
comment
@LenaBru protected void onActivityResult(int requestCode, int resultCode, Intent intent) сигнатура метода от Activity   -  person betorcs    schedule 30.06.2014
comment
@betorcs ваше наблюдение неверно, onActivityResult(int,int,Intent) также является подписью при получении внутри фрагмента.   -  person Lena Bru    schedule 30.06.2014
comment
добавьте немного Log.d перед super.onActivityResult(...)   -  person pskink    schedule 30.06.2014
comment
@LenaBru это public в Fragmentи protected в Activity.   -  person betorcs    schedule 30.06.2014
comment
Я поставил точку останова в onDestroy() MainActivity, и она вызывается. Но я не знаю почему.   -  person user292344    schedule 30.06.2014
comment
добавьте Log.d в onCreate, onActivityResult и onDestroy. что тогда ты видишь?   -  person pskink    schedule 30.06.2014
comment
Можете ли вы опубликовать ошибку logcat здесь?   -  person r.bhardwaj    schedule 30.06.2014
comment
Может быть, это большая подсказка. В logcat есть одно сообщение об ошибке: 06-30 11:32:48.847: E/ViewRootImpl(9898): sendUserActionEvent() mView == null   -  person user292344    schedule 30.06.2014
comment
так что такое логкэт?   -  person pskink    schedule 30.06.2014
comment
06–30 11:32:48.847: E/ViewRootImpl(9898): sendUserActionEvent() mView == null   -  person user292344    schedule 30.06.2014
comment
хорошо, кажется, вы не хотите получить никакого ответа...   -  person pskink    schedule 30.06.2014
comment
В подробном режиме логарифм слишком длинный на 4700 символов, чтобы публиковать его здесь.   -  person user292344    schedule 30.06.2014
comment
Мне удалось добавить подробный логарифм к исходному вопросу. Я искал ошибку mView==null. Возможно, это связано с Самсунгом. Я запускаю это на Samsung Galaxy Tab 2 (7 дюймов).   -  person user292344    schedule 30.06.2014


Ответы (4)


Попробуйте установить mainActivity как

        android:launchMode="singleTask"

в вашем AndroidManifest.

person axl coder    schedule 30.06.2014
comment
Все так же ведет себя. - person user292344; 30.06.2014

Попробуйте изменить метод с protected на public

person Lena Bru    schedule 30.06.2014

Я считаю, что это потому, что launchMode, просмотрите его в AndroidManifest

Попробуйте с singleTop

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

[ОТРЕДАКТИРОВАНО]

Сделайте это изменение и скажите мне, что происходит, когда вы нажимаете в окне настроек.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.settings:
                Intent intent = new Intent(this, SettingsActivity.class);
                startActivityForResult(intent, ACTIVITY_CREATE);
                break;
    }
    return super.onOptionsItemSelected(item);
}
person betorcs    schedule 30.06.2014
comment
Я попробовал идею возврата super.onOptionsItemSelected(item), и это не имело никакого значения. - person user292344; 30.06.2014
comment
Я вижу, ваш код выглядит довольно просто. Не могли бы вы отправить код обоих классов, чтобы попробовать запустить их здесь? - person betorcs; 30.06.2014

Я нашел проблему. У меня был финиш() в конце функции onStop() MainActivity.

person user292344    schedule 30.06.2014