В чем разница между OnActivityResult() и OnNewResult()?

Пожалуйста, посмотрите на это фото

Я хочу, чтобы приложение выглядело как эта фотография..

Когда я нажимаю кнопку MainActivity для под-действий, OnActivityResult() и OnNewIntent() вызываются в MainActicity.

Я намереваюсь вызвать OnActivityResult () для возврата из MenuActivity и вызвать OnNewIntent() для возврата из подпрограмм.

Я узнал, что материнская активность вызывает дочернюю активность через StartActivityForResult (), а дочерняя вызывает setResult () для возврата. И когда целевая активность, которую я хочу вызвать, жива, я узнал, что onNewContent () необходим, потому что целевая активность не вызывает onCrete ().

Но я думаю, что я не прав. Пожалуйста, дайте мне знать, в чем разница OnActivityResult () и OnNewResult ()? а также я хочу знать, почему OnActivityResult вызывается, хотя setResult не вызывается в setResult ().

Заранее спасибо.

MainActivity.java

public class MainActivity extends AppCompatActivity {

EditText editText;
EditText editText2;

public static final int REQUEST_CODE_MENU = 100;

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

    editText = (EditText) findViewById(R.id.editText);
    editText2 = (EditText) findViewById(R.id.editText2);

    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(editText.getText().toString().length() != 0 &&
                    editText2.getText().toString().length() != 0){
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
                startActivityForResult(intent, REQUEST_CODE_MENU);
            } else {
                Toast.makeText(getApplicationContext(),"ID와 비밀번호를 입력해주세요.", Toast.LENGTH_LONG).show();
            }
        }
    });
}

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



    if (requestCode == REQUEST_CODE_MENU) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(getApplicationContext(), "MenuActivity에서 온 Intent입니다.", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getApplicationContext(), "ERROR :  The value of resultCode is not RESULT_OK", Toast.LENGTH_LONG).show();
        }
    } else if {
        Toast.makeText(getApplicationContext(), "ERROR :  The value of requestCode is not REQUEST_CODE_MENU (100)", Toast.LENGTH_LONG).show();
    }
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Toast.makeText(getApplicationContext(), intent.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show();
  }
}

MenuActivity.java

public class MenuActivity extends AppCompatActivity {

public static final int REQUEST_CODE_CUSTOM = 200;
public static final int REQUEST_CODE_REVENUE = 300;
public static final int REQUEST_CODE_PRODUCT = 400;

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

    Button custom = (Button) findViewById(R.id.custom);
    custom.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_cus = new Intent(getApplicationContext(), CustomActivity.class);
            startActivityForResult(intent_cus, REQUEST_CODE_CUSTOM);
        }
    });

    Button revenue = (Button) findViewById(R.id.revenue);
    revenue.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_rev = new Intent(getApplicationContext(), RevenueActivity.class);
            startActivityForResult(intent_rev, REQUEST_CODE_REVENUE);
        }
    });

    Button product = (Button) findViewById(R.id.product);
    product.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_pro = new Intent(getApplicationContext(), ProductActivity.class);
            startActivityForResult(intent_pro, REQUEST_CODE_PRODUCT);
        }
    });

    Button tologin = (Button) findViewById(R.id.tologin);
    tologin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_login = new Intent(getApplicationContext(), MainActivity.class);
            setResult(RESULT_OK, intent_login);
            finish();
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode){
        case REQUEST_CODE_CUSTOM :
            Toast.makeText(getApplicationContext(), data.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show(); break;
        case REQUEST_CODE_PRODUCT :
            Toast.makeText(getApplicationContext(), data.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show(); break;
        case REQUEST_CODE_REVENUE :
            Toast.makeText(getApplicationContext(), data.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show(); break;
        default :
            Toast.makeText(getApplicationContext(), "ERROR occured.", Toast.LENGTH_LONG).show();
    }
  }
}

CustomActivity.java (одно из вложенных действий, его код полностью совпадает с другими вложенными действиями)

public class CustomActivity extends AppCompatActivity {

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

    Button tomenu = (Button) findViewById(R.id.tomenu);
    Button tologin = (Button) findViewById(R.id.tologin);

    tomenu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent from_cus = new Intent(getApplicationContext(), MenuActivity.class);
            from_cus.putExtra("from", "CustomActivity");
            setResult(RESULT_OK, from_cus);
            finish();
        }
    });

    tologin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent from_cus = new Intent(getApplicationContext(), MainActivity.class);
            from_cus.putExtra("from", "CustomActivity");
            from_cus.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(from_cus);
            finish();
        }
    });
  }
}

2 ответа

Решение

Из документации сказано:

Это вызывается для действий, которые устанавливают для launchMode значение "singleTop" в своем пакете или если клиент использовал флаг FLAG_ACTIVITY_SINGLE_TOP при вызове startActivity(Intent). В любом случае, когда действие перезапускается в верхней части стека действий вместо нового экземпляра запускаемого действия, onNewIntent() будет вызываться для существующего экземпляра с Intent, который использовался для перезапуска Это.

Итак, если вы прочитаете это внимательно, onNewIntent() всегда будет срабатывать всякий раз, когда один и тот же экземпляр действия получает новое намерение. В вашем случае вы отправляете намерение RESULT_OK, поэтому в конечном итоге onNewIntent() получит это.

И всякий раз, когда вы делаете startActivityForResult() вызов от родительского действия, родительское действие будет ожидать результата, время родительского действия вернется на передний план, даже если мы не отправим какой-либо результат обратно в действие, будет вызван onActivityResult и отправит код ответа RESULT_CANCELED. Вот как эта цепь была разработана.

Короче говоря, onNewIntent() вызывается для любых намерений, приходящих в вашу деятельность.

OnActivityResult () возвращает результат намерения, начатого startActivityForResult()

Другие вопросы по тегам