美文网首页
Android 登录成功后再跳转到目标页(一)

Android 登录成功后再跳转到目标页(一)

作者: 烧伤的火柴 | 来源:发表于2019-12-03 09:58 被阅读0次

    介绍

    我们在开发的时候,一定会遇到页面跳转,当没有登录的时候,先跳转到登录,登录成功后再跳转到目标页。如下图:


    跳转到目标页.png

    实现这种效果有四种方式:

    • a. 把数据传递到登录页面,登录成功后,把数据在传递到目标页。登录页面除了登录功能还有传递数据的功能,但是由于要跳转的页面和登录页是多对一的关系,所以登录页面要用一个标记记录目标页,而且要传递数据的时候也要经过登录页。

    • b.利用startActivityForResult异步回调将登录结果返回给源Activity,源Activity在onActivityResult进行下一步操作。

    • c.使用动态代理的技术实现。

    • d.参考插件化中启动插件activity的方式,使用Hook技术修改系统startActivity的行为

    本篇文章主要介绍第一种方案,第一种方案的特点是,简单易上手不容易出错,缺点是你自己要传递的数据被登录页面给窃取了,当要跳转的页面比较多的时候,登录页面就会变得臃肿庞大,登录页面多了一些额为的不属于它的工作。

    举例介绍

    这里举一个简单的例子:主页两个按钮分别跳转到我的收藏 我的产品两个页面,这两个页面都需要登录。项目的目录结构如下:

    登录拦截拦截器.png

    Constant 记录一些常量
    LoginActivity 登录页
    MainActivity 主页
    MyFavoriteActivity 我的收藏
    MyGoodsActivity 我的产品

    不传递数据的时候

    主页的布局不在介绍,直接说明主页按钮的事件的处理:

    public class MainActivity extends AppCompatActivity {
        private Button myGoodsBtn, myFavoritesBtn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            myGoodsBtn = findViewById(R.id.myGoodsBtn);
            myFavoritesBtn = findViewById(R.id.myFavoriteBtn);
            myGoodsBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    lookMyGoods();
                }
            });
    
            myFavoritesBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    lookMyFavorite();
                }
            });
        }
    
        private void lookMyGoods() {
            if (Constant.isLogin) {
               MyGoodsActivity.launch(this);
            }else {
                LoginActivity.launch(this, Constant.REQUEST_CODE_GOODS);
            }
        }
    
        private void lookMyFavorite() {
            if (Constant.isLogin) {
                MyFavoriteActivity.launch(this);
            }else {
                LoginActivity.launch(this, Constant.REQUEST_CODE_FAVORITE);
            }
        }
    
    

    逻辑很简单:没登录就跳转到登录页,但是要传递一个标记过去。登录的时候直接跳转到目标页。

    我的收藏页面

    public class MyFavoriteActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_favorite);
        }
    
        public static void launch(Activity activity){
            Intent intent = new Intent(activity, MyFavoriteActivity.class);
            activity.startActivity(intent);
        }
    }
    

    我的产品页

    public class MyGoodsActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_goods);
         
        }
    
        public static void launch(Activity activity){
            Intent intent = new Intent(activity, MyGoodsActivity.class);
            activity.startActivity(intent);
        }
    
    

    登录页

    public class LoginActivity extends AppCompatActivity {
        private EditText userNameEditTv, passwordEditTv;
    
        private int nextForwardCode = -1;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            nextForwardCode = getIntent().getIntExtra(KEY_NEXT_FORWARD, -1);
    
            userNameEditTv = findViewById(R.id.userNameEditTv);
            passwordEditTv = findViewById(R.id.passwardEditT);
    
            Button loginButton = findViewById(R.id.loginBtn);
            loginButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (Constant.isLogin) {
                        Toast.makeText(LoginActivity.this, "亲,您已经登录了,请不要重复登录!", Toast.LENGTH_LONG).show();
                    } else {
                        if (TextUtils.isEmpty(userNameEditTv.getText()) || TextUtils.isEmpty(passwordEditTv.getText())) {
                            Toast.makeText(LoginActivity.this, "亲,请输入合法的用户名或者密码!", Toast.LENGTH_LONG).show();
                            return;
                        }
                        Constant.isLogin = true;
                        Toast.makeText(LoginActivity.this, "亲,登录成功!", Toast.LENGTH_LONG).show();
                        handleLoginSuccess();
                    }
                }
            });
        }
    
        /**
         * 不传递数据
         */
        private void handleLoginSuccess() {
            if (nextForwardCode == -1) {
                return;
            }
    
            if (nextForwardCode == Constant.REQUEST_CODE_GOODS) {
                //todo 查看我的商品
                MyGoodsActivity.launch(this);
                finish();
            } else if (nextForwardCode == Constant.REQUEST_CODE_FAVORITE) {
                //todo 查看我的收藏
                MyFavoriteActivity.launch(this);
                finish();
            }
        }
    
        private static final String KEY_NEXT_FORWARD = "next_forward";
    
        public static void launch(Activity activity, int code) {
            Intent intent = new Intent(activity, LoginActivity.class);
            intent.putExtra(KEY_NEXT_FORWARD, code);
            activity.startActivity(intent);
        }
    
    }
    
    

    登录页面主要就是根据传递过来的KEY_NEXT_FORWARD来分别跳转到不同的目标页。
    这种页面跳转的实现起来较简单,但是当传递数据的时候,就比较棘手了。

    传递数据的时候

    传递数据的时候要把数据传递给登录页,登录页要进行分发,所以登录页面又多了一分责任。
    修改后的我的商品页面:

    public class MyGoodsActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_goods);
            String data = getIntent().getStringExtra(KEY_DATA);
            if (!TextUtils.isEmpty(data)) {
                Toast.makeText(this, "我的产品--》data="+data,Toast.LENGTH_LONG).show();
            }
    
            Bundle bundle = getIntent().getBundleExtra(Constant.KEY_DATA);
            if (bundle != null) {
                String msg = bundle.getString(Constant.KEY_MSG);
                if (!TextUtils.isEmpty(msg)) {
                    Toast.makeText(this, "我的产品--》msg="+msg,Toast.LENGTH_LONG).show();
                }
            }
        }
    
        public static void launch(Activity activity){
            Intent intent = new Intent(activity, MyGoodsActivity.class);
            activity.startActivity(intent);
        }
    
        private static final String KEY_DATA = "data";
        public static void launchForResult(Activity activity, String data){
            Intent intent = new Intent(activity, MyGoodsActivity.class);
            intent.putExtra(KEY_DATA, data);
            activity.startActivity(intent);
        }
    
        public static void launch(Activity activity, Bundle bundle){
            Intent intent = new Intent(activity, MyGoodsActivity.class);
            intent.putExtra(Constant.KEY_DATA, bundle);
            activity.startActivity(intent);
        }
    
    }
    

    修改后的收藏页面:

    public class MyFavoriteActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_favorite);
    
            String data = getIntent().getStringExtra(KEY_DATA);
            if (!TextUtils.isEmpty(data)) {
                Toast.makeText(this, "我的收藏--》data="+data,Toast.LENGTH_LONG).show();
            }
    
            Bundle bundle = getIntent().getBundleExtra(Constant.KEY_DATA);
            if (bundle != null) {
                String msg = bundle.getString(Constant.KEY_MSG);
                if (!TextUtils.isEmpty(msg)) {
                    Toast.makeText(this, "我的收藏--》msg="+msg,Toast.LENGTH_LONG).show();
                }
            }
        }
    
        public static void launch(Activity activity){
            Intent intent = new Intent(activity, MyFavoriteActivity.class);
            activity.startActivity(intent);
        }
    
        private static final String KEY_DATA = "data";
        public static void launch(Activity activity, String data){
            Intent intent = new Intent(activity, MyGoodsActivity.class);
            intent.putExtra(KEY_DATA, data);
            activity.startActivity(intent);
        }
    }
    

    修改后的主页:

    public class MainActivity extends AppCompatActivity {
       ......
        private void lookMyGoods() {
            if (Constant.isLogin) {
    //            MyGoodsActivity.launch(this);
    
                MyGoodsActivity.launch(this, "产品");
            }else {
    //            LoginActivity.launch(this, Constant.REQUEST_CODE_GOODS);
    
                Bundle bundle = new Bundle();
                bundle.putString(Constant.KEY_MSG, "通过登录传递的产品");
                LoginActivity.launch(this, Constant.REQUEST_CODE_GOODS,bundle);
            }
        }
    
        private void lookMyFavorite() {
            if (Constant.isLogin) {
    //            MyFavoriteActivity.launch(this);
    
                MyFavoriteActivity.launch(this, "收藏");
            }else {
    //            LoginActivity.launch(this, Constant.REQUEST_CODE_FAVORITE);
                Bundle bundle = new Bundle();
                bundle.putString(Constant.KEY_MSG, "通过登录传递的收藏");
                LoginActivity.launch(this, Constant.REQUEST_CODE_FAVORITE,bundle);
            }
        }
    
    }
    

    修改后的登录页:

    public class LoginActivity extends AppCompatActivity {
       ...
        private Bundle bundle;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
          ...
            loginButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (Constant.isLogin) {
                        Toast.makeText(LoginActivity.this, "亲,您已经登录了,请不要重复登录!", Toast.LENGTH_LONG).show();
                    } else {
                        if (TextUtils.isEmpty(userNameEditTv.getText()) || TextUtils.isEmpty(passwordEditTv.getText())) {
                            Toast.makeText(LoginActivity.this, "亲,请输入合法的用户名或者密码!", Toast.LENGTH_LONG).show();
                            return;
                        }
                        Constant.isLogin = true;
                        Toast.makeText(LoginActivity.this, "亲,登录成功!", Toast.LENGTH_LONG).show();
    //                    handleLoginSuccess();
                        handleLoginSuccess2();
                    }
                }
            });
        }
    
      ...
    
        /**
         * 传递数据
         */
        private void handleLoginSuccess2(){
            if (bundle == null) {
                return;
            }
    
            if (nextForwardCode == Constant.REQUEST_CODE_GOODS) {
                //todo 查看我的商品
                MyGoodsActivity.launch(this, bundle);
                finish();
            } else if (nextForwardCode == Constant.REQUEST_CODE_FAVORITE) {
                //todo 查看我的收藏
                MyGoodsActivity.launch(this, bundle);
                finish();
            }
        }
      .......
        public static void launch(Activity activity, int code, Bundle bundle) {
            Intent intent = new Intent(activity, LoginActivity.class);
            intent.putExtra(KEY_NEXT_FORWARD, code);
            intent.putExtra(Constant.KEY_DATA, bundle);
            activity.startActivity(intent);
        }
    }
    

    从handleLoginSuccess2方法可以看出,在项目中当很多要跳转的页面的时候,这个方法内部就要写很多switch语句,冗余的代码势必增加日后项目的维护难度,而且登录页面承担了一些额为的责任,这也违背了软件设计原则的单一原则。

    但是这种方式也有优点就是容易上手,如果是项目周期短,可以采用这种方案。

    下一篇介绍第二种方案

    相关文章

      网友评论

          本文标题:Android 登录成功后再跳转到目标页(一)

          本文链接:https://www.haomeiwen.com/subject/jyaxgctx.html