Android: StartActivityForResult для одного действия, но возвращает результат в другом

В настоящее время у меня есть проблема, которую нужно решить.

Мое приложение позволяет другому приложению (скажем, A) запускать мое приложение и возвращать результат.

Приложение Звонок:

 Intent sendIntent = 
 getPackageManager().getLaunchIntentForPackage("com.my.package");

 sendIntent.setAction(Intent.ACTION_SEND);
 sendIntent.setFlags(0);
 sendIntent.putExtra("amount", "20000");
 startActivityForResult(sendIntent, 1);

Затем мое приложение запустит MainActivity.
Однако, чтобы получить результат и отправить его обратно в приложение A, мне нужно запустить некоторые другие действия, скажем:

 MainActivity -> Activity B -> Activity C --> Activity D.

Результат может быть возвращен в приложение A из действия C или действия D.

Обратите внимание: я не могу использовать флаг FLAG_ACTIVITY_FORWARD_RESULT, потому что от B до C я вызвал «startActivityForResult». (startActivityForResult и флаг FLAG_ACTIVITY_FORWARD_RESULT не могут идти вместе).

Можете ли вы дать мне несколько идей, как этого добиться?
Большое спасибо.


person Ngo Van    schedule 15.06.2017    source источник


Ответы (2)


чтобы получить результат, вы можете вызвать действие B из MainActiviy и перейти к действию C, а затем D

если вы хотите вернуться, вы должны сделать это один за другим, завершить каждое действие и установить результат в onActivityResult.

сделайте так, если вы должны вернуться к своей основной деятельности:

    //in MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent(MainActivity.this, ActivityB.class);
    startActivityForResult(intent, REQUEST_CODE_MAIN_ACTIVITY);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_CODE_MAIN_ACTIVITY && resultCode == RESULT_OK){
        //maybe get back to application that called you 
    }
}

//in Second activity
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_B);
    Intent intent = new Intent(ActivityB.this, ActivityC.class);
    startActivityForResult(intent, REQUEST_CODE_ACTIVITY_B);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_CODE_ACTIVITY_B && resultCode == RESULT_OK){
        setResult(RESULT_OK);
        finish();
    }
}

и если вы можете напрямую вызвать первое приложение из действия D, вы можете вызвать первое приложение и закрыть второе приложение.

person Meikiem    schedule 15.06.2017
comment
Если вы закончите MainActivity и перейдете к Activivty B. Результат Cancel будет немедленно возвращен в приложение A. - person Ngo Van; 15.06.2017
comment
Нет, я имею в виду другое, я запишу код, пожалуйста, подождите - person Meikiem; 15.06.2017

Из вашего 1-го действия вызовите 2-е действие, используя метод startActivityForResult()

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

Во 2-м действии, если вы хотите отправить данные обратно:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

Если вы не хотите возвращать данные:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Теперь в вашем 1-м классе Activity напишите следующий код для метода onActivityResult().

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

    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}//onActivityResult
person Narasing    schedule 03.11.2017