使用finish()和intent FLAGS

时间:2015-09-12 18:39:15

标签: android android-intent login back-stack

目前我正在为我的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活动,我会检查非空意图

 @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活动

@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();
    }
}

流程是用户点击应用 - >派遣活动(假设第一次使用者) - > SignInActivity - >广播接收者发送和接收短信 - >在非常有效的OTP之后向signInActivity发送信息 - >用户转到MainActivity页面。在任何时候我都不希望用户能够回击按钮并转到上一个活动。我尝试过使用Intent标志和finish()。 BroadCastReceiver将意图发送到SignInActivity而不是MainActivity,因为我想显示动画/ TOAST,这就是为什么我有一个代码检查非null Intent的原因。但我能够回到非常令人沮丧的活动。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

首先,我相信你会覆盖使用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返回Intent对象,因此您甚至可以将调用链接在一起:

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

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