APP登陆设计 User的全局设置

登录过后APP保存一个User对象这个对象和整个APP紧密相关。下面说一下User是如何设计的.

首先在APPlication类中添加User对象 并设置获取和设置的方法:

public class MyApplication extends Application
{
    private User user;


        @Override
        public void onCreate() {
            super.onCreate();

            initAppComponent();

        }


    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;

    }


 

}

在登陆界面时通过全局Application 设置。

  User user=new User();
             MyApplication myApplication=MyApplication.getInstance(this);
             //此处用数据库模拟网络操作获取的数据
             Cursor cursor= userDb.selectUserMessage(phone);
             if(cursor.moveToFirst()){
                 do{
                     user.setAccount(cursor.getString(cursor.getColumnIndex("userphone")));
                     user.setPassword(cursor.getString(cursor.getColumnIndex("userKeyword")));
                     user.setNicheng("张三");
                 }while(cursor.moveToNext());
             }
             if(cursor!=null){
                 cursor.close();
             }

             myApplication.setUser(user);
             


另外如果有些Actvitiy 需要登陆才能进入那么我们需要重写 操作所在Activity(更多时候是BaseActivity)的StartActivity方法和StartActivityForResult方法(因为需要返回数据刷新刚才的界面)

public  abstract class BaseActivity extends AppCompatActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        setupActivityComponent(MyApplication.getInstance(this).getAppComponent());
    }


//重载获取方法 启动时判断
    public void startActivityForResult(Intent intent,boolean isNeedLogin, int requestCode) {
        if (isNeedLogin) {

            User user = MyApplication.getInstance(this).getUser();
            if (user != null) {
                super.startActivityForResult(intent,requestCode);
            } else {
              Log.d("is else",""+isNeedLogin);
                Intent loginIntent = new Intent(this, LoginActivity.class);
                super.startActivityForResult(loginIntent,requestCode);
            }

        } else {
            super.startActivityForResult(intent,requestCode);
        }
    }

  //重载了这个方法  每当 要跳转到另外一个Activity时,增加一个参数用来判断是否需要登录 如果没登录则会跳转至登录界面
    public void startActivity(Intent intent,Boolean isNeedLogin) {

        if (isNeedLogin) {

            User user = MyApplication.getInstance(this).getUser();
            if (user != null) {
                super.startActivity(intent);
            } else {

         //       MyApplication.getInstance(this).putIntent(intent);
                Intent loginIntent = new Intent(this, LoginActivity.class);
                super.startActivity(loginIntent);

            }

        } else {
            super.startActivity(intent);
        }
        super.startActivity(intent);
    }


}

当通过StartAcitivityForResult (成功跳转至登陆界面后登陆成功后往往需要返回数据并刷新所在的界面:

所以要给登陆界面 如步骤2 一样 设置User 并且设置resultCode


最后在需要更新VIew的Activity 中会回调 需要设置的请求码和返回码都相等才能执行这个逻辑,返回码和请求码是确定从那个Activity发出和结束的。

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       
        if (requestCode == Contants.REQUEST_CODE && resultCode == this.RESULT_OK) {

            new Thread() {
                public void run() {
                    //这儿是耗时操作,完成之后更新UI;
                    runOnUiThread(new Runnable(){

                        @Override
                        public void run() {
                            //通知子view g

                            MinePagerView minePagerView= (MinePagerView) mainViewPagerAdapter.getPagerViewArrayList().get(3);
                            minePagerView.initView();
                            mainViewPagerAdapter.notifyDataSetChanged();
                        }

                    });
                }
            }.start();

        }
    }


在需要登陆的界面 通常有些控件需要判断User是否存在,如果不存在则是两种状态例如 提示登陆的TextView

 User user =  MyApplication .getInstance(mainActivity).getUser();
            if(user ==  null){

                textView_Log .setText(ř "登陆“);
            } else {
                textView_Log .setText(usr。 getNicheng());
                //并载入用户信息!
               // loadMineData();

            }


通常登录成功后依然要跳转至某界面:

所以在application中保存Intent 并提供方法:

 private Intent intent;

    public void putIntent(Intent intent) {
        this.intent = intent;
    }

    public Intent getIntent() {
        return this.intent;
    }
    //跳转至目标activity
    public void jumpToTargetActivity(Context context) {

        context.startActivity(intent);
        this.intent = null;
    }

在跳转前 put 

回调时get :

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("执行回调","1");

        if (requestCode == Contants.REQUEST_CODE && resultCode == this.RESULT_OK) {

            new Thread() {
                public void run() {
                    //这儿是耗时操作,完成之后更新UI;
                    runOnUiThread(new Runnable(){

                        @Override
                        public void run() {
                            //通知子view g

                            MinePagerView minePagerView= (MinePagerView) mainViewPagerAdapter.getPagerViewArrayList().get(3);
                            minePagerView.initView();
                            mainViewPagerAdapter.notifyDataSetChanged();
                        }

                    });
                }
            }.start();

        }


        User user = MyApplication.getInstance(this).getUser();
        if (user != null) {
            //跳转至目标Activity
            if (MyApplication.getInstance(this).getIntent() == null) {

            }
            else {
                MyApplication.getInstance(this).jumpToTargetActivity(this);
            }
        }
        else {

        }


    }



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值