Preservar Actividad después de presionar el botón “Atrás”

Estoy trabajando una aplicación con la cual realiza una autenticación a través de una actividad "A" (LoginActivity), este instancia la actividad "B" (LoginTask) que hereda de AsyncTask para realizar dicho proceso, una vez realizada la autenticación se instancia a la actividad "C" (PrincipalActivity), siendo algo como esto A ==> B ==> C.

Ubicado en la actividad "C", presiono el botón "Atras" y este me "saca" de la actividad principal y me ubica en la actividad "A", decir, me regresa a la pantalla de logueo. Aquí mi código:

LoginActivity

public class LoginActivity extends AppCompatActivity {

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

private void initUI() {
  Typeface font = Typeface.createFromAsset(getApplicationContext().getAssets(),"fonts/NotoSans-Regular.ttf");

  final EditText txtUser = (EditText)findViewById(R.id.txtUser);
  txtUser.setTypeface(font);
  final EditText txtPass = (EditText)findViewById(R.id.txtPass);
  txtPass.setTypeface(font);
  Button btnAccess = (Button) findViewById(R.id.btnAccess);
  btnAccess.setTypeface(font);

  btnAccess.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Login loginBean = new Login();
        String user = txtUser.getText().toString().trim();
        String pass = txtPass.getText().toString().trim();
        if (!user.equals("")){
            if(!pass.equals("")){
                loginBean.setUser(user.toUpperCase());
                loginBean.setPass(pass);
            }else {
                txtPass.setError(getString(R.string.err_pass));
                return;
            }
        }else {
            txtUser.setError(getString(R.string.err_user));
            return;
        }
        LoginTask loginTask = new LoginTask(LoginActivity.this,loginBean);
        loginTask.execute();
    }
  });
 }    
}

LoginTask

public class LoginTask extends AsyncTask {

  private ProgressDialog progressDialog;
  private Context context;
  private Resources resources;
  private Login loginParams;
  private String msgAccess;

  public LoginTask(Context context, Login loginParams){
    this.context = context;
    this.resources = context.getResources();
    this.loginParams = loginParams;
  }

  protected void onPreExecute(){
    progressDialog = new ProgressDialog(context);
    progressDialog.setMessage(resources.getString(R.string.msg_access));
    progressDialog.setCancelable(true);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressDialog.show();
  }

  @Override
  protected String doInBackground(Object[] objects) {
    //Autenticación
    return msgAccess;
  }

  protected void onPostExecute(Object o){
    if (msgAccess != null) {
      if (msgAccess.equals("OK")) {
         Intent intent = new Intent(context, PrincipalActivity.class);
         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
         context.startActivity(intent);
         ((Activity)context).finish();
      } else{
        Toast.makeText(context, msgAccess, Toast.LENGTH_LONG).show();
      }
    }else{
      Toast.makeText(context, R.string.err_msg_null, Toast.LENGTH_LONG).show();
    }

    if (progressDialog.isShowing()) {
      progressDialog.dismiss();
    }
  } 
}

Entonces, lo que habia pensado era realizar algun tipo de validación en el evento onBackPressed() de mi clase principal para que cuando presione el botón "Atras" no me regrese a "A", sino, me mantenga en la actividad principal "C":

@Override
public void onBackPressed() {
    if (LoginPersistence.getStatus() > 0 && !LoginPersistence.getToken().equals("")){
 //Agregar aqui la validación
    }
}

Para ser mas explicito, lo que indico es que cuando estoy en mi actividad principal "C" y presiono el botón "Atrás", este me regresa a la actividad "A", es decir, para ingresar nuevamente usuario y password, cuando no debería hacerlo. Al presionar el botón "Atrás", debería "minimizar" mi aplicación y cuando vuelva a ingresar debería mantenerla en la actividad principal. Es lo que hago cuando presiono el botón "Home", me minimiza la aplicación y cuando vuelvo, me carga donde me quedé y esto lo logro con intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);.

Espero haberme explicado. Gracias.

9
задан 03.01.2016, 23:26
5 ответов

На основании твоего вопроса, ты хочешь возвратиться в "активность B", LoginTask, но помни, что это в действительности не одна Actividad, его один AsyncTask.

  • "A" (LoginActivity)
  • "B" (LoginTask)
  • "C" (PrincipalActivity)

LoginTask - один Thread, который в действительности реализует один Intent, чтобы открывать активность PrincipalActivity.

 Intent intent = new Intent(context, PrincipalActivity.class);

, Если ты хочешь возвратить в "B" LoginTask, тогда этот класс будь должен увеличивать Activity и внутри этого класса инстанция Asynctask с той же функциональностью.

8
ответ дан 08.11.2019, 21:06
  • 1
    В действительности я не хочу вернуться в активность " B" а скорее, предохранять главную активность " C" после нажав раньше на bot и # 243; n " atr и # 225; s". Ввиду того, что, когда я нажимаю на bot и # 243; n " atr и # 225; s" он возвращает меня в активность " A" идея состоит в том, чтобы поддерживать это в " C". Спасибо. – Brando T. 02.12.2015, 07:37
  • 2
    Брандо в ответе / предложении, который присоединил тебя внизу, ты можешь добиваться, чтобы он не возвратил тебя ни в какую активность, но он не оставит тебя на активности " C" просто он закроет твое приложение, если ничего нет за нею, куда возвращаться. – Ramon Felix 02.12.2015, 09:42

LoginTask не активность, это асинхронное, и это задание ты можешь объявлять ее внутри LoginActivity.

Проверив удостоверение в MainActivity инициализируй такого LoginActivity:

    if(!isAuthenticated){
        Intent intent = new Intent(this, LoginActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        MainActivity.this.finish();
    }

То, что мы сделали здесь, состояло в том, чтобы заканчивать MainActivity, бросив LoginActivity, тогда, если удостоверение не было правильно или совсем не осуществлялось тогда, когда ты нажмешь назад, он вытечет из приложения, не возвращаясь в главную активность.

Заверив тебя правильно только ты должен инициализировать снова главную активность "MainActivity" тогда инициализируешь ее таким образом применяя то же начало наверху:

Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent)
LoginActivity.this.finish();

С этим это должный быть быть достаточно, чтобы возвращаться из LoginActivity к MainActivity после того, как инициализировать сеанс, и когда ты нажмешь назад, закончится приложение.

3
ответ дан 08.11.2019, 21:06

В тебе AndroidManifest.xml ты должен присоединять android:noHistory="true"

    <activity
        android:name=".LoginActivity"
        android:label="@string/app_name"
        android:noHistory="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

и эта активность будет храниться в биографии активности.

2
ответ дан 08.11.2019, 21:06
  • 1
    Спасибо @cristhoper, я буду проверять то, что ты показываешь. – Brando T. 16.12.2015, 08:39

Используй FLAG_ACTIVITY_CLEAR_TASK, вместо FLAG_ACTIVITY_CLEAR_TOP, когда ты инициализируешь твою активность:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

Это в меня я функционировало, когда давление "back" будь должен закрывать просто ты aplicaciГіn.

Надеялся, что оно ты функционирует.

0
ответ дан 08.11.2019, 21:06

То, что отвечает Elenasys, правильно. LoginTask это одна AsyncTask, с чем это не одна Activity. Ты не можешь "возвращаться к ней". Если ты хочешь понять что-то еще на состоянии твоего stack activities, ты можешь скроллировать следующую команду adb:

adb shell dumpsys activities

Там ты сможешь видеть, как твоя активность и понимание, что произойдет, когда ты нажимаешь "back".

-1
ответ дан 08.11.2019, 21:06

Теги

Похожие вопросы