首页 > 系统 > Android > 正文

Android 跳转判断是否登录的进一步封装

2019-11-09 15:29:27
字体:
来源:转载
供稿:网友

Android 进入界面判断是否登录.如果登录直接进入界面,未登录就跳转到登录,登录成功后直接进入之前要进入的界面

看起来有点绕口,其实就是一个界面跳转的小东西 目录如下

如下

Appapplication类 系统类LoginActivity 登录界面NumberOneActivity 界面 ANumberTwoActivity 界面 BAppEnv类 用来存放一些数据*IntentEvent类,用来接收行为IntentRequestCode 类,存放请求码BaseActivity 父类,接收,注册和销毁EventBusLoginChecker 登录检测界面

其实重点是在 LoginChecker类中,先看一下代码

public class LoginChecker extends BaseActivity { static LoginCallback mCallback; public interface LoginCallback { void onLogined(); } @Override PRotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = new Intent(this, LoginActivity.class); startActivityForResult(intent, IntentRequestCode.Login); } public static void doAfterLogin(@NonNull LoginCallback callback){ // 为了方便测试,这里传入false, 表示用户没有登录 if (isLogined(false)) { callback.onLogined(); }else { mCallback = callback; Intent intent = new Intent(AppEnv.getApplicationContext(), LoginChecker.class); EventBus.getDefault().post(new IntentEvent(intent)); } } /** * 检测是否登录成功, * * @param logined 实际开发中不需要传入此参数, * @return */ public static boolean isLogined(boolean logined) { return logined; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); finish(); // 这里传入true.是指从登录界面登录后,从新获取到正确的登录token if (isLogined(true) && requestCode == IntentRequestCode.Login) { if (mCallback != null) { mCallback.onLogined(); } } mCallback = null; }}

BaseActivity

public class BaseActivity extends AppCompatActivity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onResume() { super.onResume(); EventBus.getDefault().register(this); } @Override protected void onPause() { super.onPause(); EventBus.getDefault().unregister(this); } @Override public void startActivity(Intent intent) { super.startActivity(intent); overridePendingTransition(0, 0); } @Override public void startActivityForResult(Intent intent, int requestCode) { super.startActivityForResult(intent, requestCode); overridePendingTransition(0, 0); } @Subscribe public void onEvent(IntentEvent event) { switch (event.getType()) { case StartActvity: startActivity(event.getIntent()); break; case StartActivityForResult: startActivityForResult(event.getIntent(), event.getRequestCode()); break; case StartService: startService(event.getIntent()); break; case SendBroadcast: sendBroadcast(event.getIntent()); break; } }}

NumberOneActivity

public class NumberOneActivity extends BaseActivity { OneBinding mBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(this,R.layout.one); init(); } private void init(){ mBinding.oneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { LoginChecker.doAfterLogin(new LoginChecker.LoginCallback() { @Override public void onLogined() { Intent intent = new Intent(NumberOneActivity.this,NumberTwoActivity.class); startActivity(intent); } }); } }); }}

NumberTwoActivity

public class NumberTwoActivity extends BaseActivity { TwoBinding mBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(this,R.layout.two); }}

LoginActivity

public class LoginActivity extends BaseActivity { LoginBinding mBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(this,R.layout.login); init(); } private void init(){ mBinding.login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { setResult(RESULT_OK); finish(); } }); }}

IntentRequestCode

public class IntentRequestCode { public static final int Login = 1000;}

IntentEvent

public class IntentEvent { private Type type; private Intent intent; private int requestCode; // only using for StartActivityForResult. public enum Type { StartActvity, StartActivityForResult, StartService, SendBroadcast } public IntentEvent(Intent intent) { this.type = Type.StartActvity; this.intent = intent; } public IntentEvent(Type type, Intent intent) { this.type = type; this.intent = intent; } public Type getType() { return type; } public void setType(Type type) { this.type = type; } public Intent getIntent() { return intent; } public void setIntent(Intent intent) { this.intent = intent; } public int getRequestCode() { return requestCode; } public void setRequestCode(int requestCode) { this.requestCode = requestCode; }}

AppEnv

public class AppEnv { private static Context mAppContext; public static void init(Context context) { mAppContext = context.getApplicationContext(); } public static Context getApplicationContext(){ return mAppContext; }}

AppApplication

public class AppApplication extends Application { @Override public void onCreate() { super.onCreate(); AppEnv.init(this); }}

重点是在doAfterLogin 这个函数中,调用isLogined函数来检测是否登录,如果登录了,就执行回调 ,未登录的情况下,创建一个 Intent,把这个 Intent当做参数放到 EventBus的消息中, (要启动的对象是自身),在 BaseActivity中注册的 EventBus 接收到消息后,获取传过去的 Intent,并启动,在 BaseActivity中重写startActivity函数,设置透明度 overridePendingTransition(0, 0);.这样就启动了LoginChecker,在 onCreate中又用startActivityForResult启动了 LoginActivity, 然后在onActivityResult 中,判断登录的情况,..应该有点绕,对项目大一点的同学来说,这样做应该比较方便后期维护! 匆忙之间写下的,有错误的地方,或者有更好的方法,欢迎各位同学留言指出


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表