使用 finish() 和意图 FLAGS

Use of finish() and intent FLAGS

目前我正在为我的 android 应用开发登录系统。

我在自定义 BroadCastReceiver 中实施了 OTP 验证过程。一旦验证了 otp,就会从 BroadCastReceiver 发送一个意图,如下所示。

    Intent c=new Intent(context.getApplicationContext(), SignInActivity.class);
    if (msgs[0].getOriginatingAddress().equals("+919920678579")) {
        c.putExtra("code", "verified");
        c.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(c);
    } else {
        Log.d("message ", "error, not verified!!");
    }

现在这会将数据发送回 signIn activity,我在其中检查非空意图

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_in);
        btn=(Button)findViewById(R.id.btn);
        Intent i=getIntent();
        if (i.getStringExtra("code")!=null){
            if (i.getStringExtra("code").equals("verified")) {
                Toast.makeText(SignInActivity.this, "verified!", Toast.LENGTH_LONG).show();
                //SHOW SOME UI CHANGES
                 Intent intent=new Intent(SignInActivity.this, MainActivity.class);
                    startActivity(intent);
                    finish();
                }
            }

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


        SmsManager smsManager = SmsManager.getDefault();
        String phoneNumber = "+919920678579";
        byte[] smsBody = "+919920678579".getBytes();
        // DO NOT CHANGE THIS. IDK WHY ITS NOT WORKING IF REFERENCED FROM INT AND TYPE CAST TO SHORT!!
        short port = 6734;
        smsManager.sendDataMessage(phoneNumber, null, port, smsBody, null, null);
        Log.d("sms ", "sent");
            }
        });

    }

和我的 Dispatch / Launcher activity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (ParseUser.getCurrentUser() != null) {
        //TODO: check validity of finish(). Supposed to remove this from backstack
        // Start an intent for the logged in activity
        Log.d("User logged in as ", ParseUser.getCurrentUser().getUsername());
        Intent mainIntent=(new Intent(this, MainActivity.class));
        mainIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(mainIntent);
        finish();
    } else {
        // Start and intent for the logged out activity
        Log.d("User ", "sent to signUp");
        Intent signIntent=(new Intent(this, SignInActivity.class));
        signIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        signIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(signIntent);
        finish();
    }
}

流程是用户点击应用 --> 发送 Activity(假设是第一次使用)--> 登录Activity --> 广播接收器发送和接收短信 --> 发送验证 OTP 后登录 Activity 的信息 --> 用户转到 MainActivity 页面。我绝不希望用户能够点击后退按钮并转到上一个 activity。我试过使用 Intent 标志和 finish()。 BroadCastReceiver 将意图发送到 SignInActivity 而不是 MainActivity 因为我想显示动画/ TOAST 这就是为什么我有一个代码检查非空意图。但我无法回到非常令人沮丧的活动。有人可以帮我吗?

首先,我相信你正在覆盖你使用setFlags设置的标志。要设置多个标志,您可以使用 addFlags,或一次设置所有标志:

一次设置所有标志:

mainIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

或:

mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

同样的效果。请注意 addFlags returns Intent 对象,因此您甚至可以将调用链接在一起:

mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

第二个,您是否尝试将这些标志应用于您在 SignInActivity 的 onCreate 方法中发送的意图?