Действие не завершается, если оно вызвало другие действия

У меня есть эта деятельность:

public class AMLoginActivity extends Activity implements IAsyncResponse {

    public static int finished;


    private final String TAG = "AMLoginActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        finished = 0;

        Intent i = new Intent(AMLoginActivity.this, GDLoginActivity.class);
        i.putExtra("response", this);
        AMLoginActivity.this.startActivity(i);


    }

    public void processFinish(){
        finished++;
        Log.i(TAG, "Number finished: " + finished);


        if(finished == 1){
            Log.i(TAG, "All finished");
            AMLoginActivity.this.finish();
            Log.i(TAG, "Finish called");
        }

    }

Который вызывает GDLoginActivity для входа в google drive. Это можно увидеть ниже:

public class GDLoginActivity extends Activity implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    private static final String TAG = "GDLoginActivity";
    private static final int REQUEST_CODE_RESOLUTION = 3;

    private static GoogleApiClient mGoogleApiClient;


    @Override
    protected void onResume() {
        super.onResume();
        if (mGoogleApiClient == null) {
            // Create the API client and bind it to an instance variable.
            // We use this instance as the callback for connection and connection
            // failures.
            // Since no account name is passed, the user is prompted to choose.
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(Drive.API)
                    .addScope(Drive.SCOPE_FILE)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
            Log.i(TAG, "New GDClient created");
        }
        // Connect the client.
        mGoogleApiClient.connect();

    }

    @Override
    protected void onPause() {
        if (mGoogleApiClient != null) {
            mGoogleApiClient.disconnect();
        }
        super.onPause();
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        Log.i(TAG, "API client connected.");

        IAsyncResponse response = (IAsyncResponse) getIntent().getSerializableExtra("response");
        Log.i(TAG, "Process finish");
        response.processFinish();
        finish();
    }

    @Override
    public void onConnectionSuspended(int cause) {
        Log.i(TAG, "GoogleApiClient connection suspended");
    }


    @Override
    public void onConnectionFailed(ConnectionResult result) {
        // Called whenever the API client fails to connect.
        Log.i(TAG, "GoogleApiClient connection failed: " + result.toString());
        if (!result.hasResolution()) {
            // show the localized error dialog.
            GoogleApiAvailability.getInstance().getErrorDialog(this, result.getErrorCode(), 0).show();
            return;
        }
        // The failure has a resolution. Resolve it.
        // Called typically when the app is not yet authorized, and an
        // authorization
        // dialog is displayed to the user.
        try {
            result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION);
        } catch (IntentSender.SendIntentException e) {
            Log.e(TAG, "Exception while starting resolution activity", e);
        }
    }


    public static  GoogleApiClient getGoogleApiClient(){
        return mGoogleApiClient;
    }

}

Проблема заключается в том, что когда GDLoginActivity подключается и finish (), он должен увеличить finish на 1, а также завершить AMLoginActivity. Он увеличивается на 1 и вызывает finish () в processFinish (), но ничего не происходит, и AMLoginActivity фактически не закрывается (т. е. onDestroy () никогда не вызывается), поэтому я просто оставлен с пустым экраном. Если я удаляю GDLoginActivity и просто вызываю processFinish() вместо этого, то AMLoginActivity заканчивается просто хорошо, поэтому я предполагаю, что это имеет какое-то отношение к GDLoginActivity, но это происходит с другими подобными действиями тоже. Есть идеи?

Edit: также, если я нажму кнопку назад на пустом экране, то он вызывает метод onDestroy() AMLoginActivity и переходит к действию, которое я хочу, если это намекает на то, что происходит?

2 ответа

  1. Похоже, вы заканчиваете их в странном порядке. Попробуйте завершить видимое действие до того, как вы закончите то, которое его запустило.

      @Override
        public void onConnected(Bundle connectionHint) {
            Log.i(TAG, "API client connected.");
    
            IAsyncResponse response = (IAsyncResponse) getIntent().getSerializableExtra("response");
            Log.i(TAG, "Process finish");
            //finishes the previous activity
            response.processFinish();
    
            //finishes the visible activity
            finish();
    
            //try flipping this order ^
        }
    

    Вы можете использоватьstartActivitForResult(), если вы пытаетесь закончить одно действие после другого.

  2. Вам нужно intentваш текущий contextк другой деятельности в первую startActivityочередь С. После этого вы можете завершить текущую деятельность, откуда вы перенаправляете.

    Intent intent = new Intent(this, FirstActivity.Class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    finish(); // Call once you redirect to another activity
    

    Есть некоторые подходы, которые вы можете использовать в вашем случае, вот пример:

    Запуск действия B Из действия A

    startActivity(new Intent(A.this, B.class));
    

    Если пользователь нажмет на кнопку Изменить, запустите действие A с помощью FLAG_ACTIVITY_CLEAR_TOP.Также передайте флаг дополнительно.

    Intent i = new Intent(B.this, A.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.putExtra("flag", "modify");
    startActivity(i);
    finish();
    

    Если пользователь нажмет на кнопку Изменить, запустите действие A с помощью FLAG_ACTIVITY_CLEAR_TOP.Также передайте флаг дополнительно.

    Intent i = new Intent(B.this, A.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.putExtra("flag", "add");
    startActivity(i);
    finish();
    

    Теперь onCreate () метод действия A, напишите ниже код.

    String flag = getIntent().getStringExtra("flag");
    if(flag.equals("add")) {
    //Write a code for add
    }else {
    //Write a code for modify
    }
    

    Вот так билет, связанный с переключением деятельности:
    android как закончить действие из другого действия