Android 进入界面判断是否登录.如果登录直接进入界面,未登录就跳转到登录,登录成功后直接进入之前要进入的界面
看起来有点绕口,其实就是一个界面跳转的小东西
目录如下
- AppApplication类 系统类
- LoginActivity 登录界面
- NumberOneActivity 界面 A
- NumberTwoActivity 界面 B
- AppEnv类 用来存放一些数据
- *IntentEvent类,用来接收行为
- IntentRequestCode 类,存放请求码
- BaseActivity 父类,接收,注册和销毁EventBus
- LoginChecker 登录检测界面
其实重点是在 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 中,判断登录的情况,..应该有点绕,对项目大一点的同学来说,这样做应该比较方便后期维护! 匆忙之间写下的,有错误的地方,或者有更好的方法,欢迎各位同学留言指出