登录过后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 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 {
}
}