在页面跳转时,也就是startActivity(intent)页面跳转的的时候,对intent设置上不同的Flags,能起到不同的效果,比如:
intent.setFlags(FLAG_ACTIVITY_CLEAR_TASK|FLAG_ACTIVITY_NEW_TASK);
上面的设置,能在启动一个新的页面时,将原先栈中的其他页面全部清除
应用场景:
比如注册页面,在你一个页面一个页面设置了诸如性别,号码,密码,邮箱等信息后,注册成功到主页面,呢么之前那些注册设置信息的页面就没用了,一个一个去finish()又太麻烦,这时候就可以在最后注册成功的时候设置Flags跳转注册页面,这样跳转的同时,也清空了之前已经没用的设置注册页面。
-
布局中进行网络操作时,让界面控件不再接受点击事件
在进行了如网络通信的异步操作时,可以在布局文件中加一个覆盖全局的布局,设置透明或者半透明,形成蒙版,并设置点击事件,这样就可以在网络通信开始时让其显示,拦截点击事件,防止用户在网络通信期间多次点击操作,在接到网络通信的回调后,再让布局设置为不可见,这样便又可以操作了。
-
布局文件中分为两个主布局,一个显示一个隐藏
这样可以将相似的布局集中在一个activity上,在点击控件时控制它们的显示隐藏,达到替换布局的效果,同时又没有activity的跳转替换,就是activity里的逻辑要区分好,避免混乱。
-
在strings资源文件中,使用占位符,能大大减少代码量和可读性
%d:表示整数型;
%f :表示浮点型,其中f前面的.2表示小数的位数
%s:表示字符串
<string name="data">我是%s</string>
getString(R.string.data,“Android菜鸟”) //我是Android菜鸟
-
在开始写代码前思考代码整体逻辑
如果需要复杂的if,case嵌套判断,考虑分方法或者分类实现,思考是否有适合的设计模式可以使用,不然一旦出bug和需求变更会十分难受
-
在替换或修改xml文件时,先确认引用了该文件的类有哪些,是否会导致不需要修改的页面遭到修改
选中文件,或者类,或者方法,右键,选择 Find Usages,便可以看到项目中所有引用到该资源的地方了
-
ConstraintLayout
ConstraintLayout是比较好用的一个布局,但是有时候会出现约束失效的情况,导致页面布局错乱,有时能解决有时无法解决,这时候可以选择其他布局重写出问题部分的ConstraintLayout,不要死钻ConstraintLayout。
-
在view的post和postDelay
view的post中是在Ui线程执行的,可以对页面进行刷新,而且因为其执行时间的在页面初始后或者说宽高计算结束后,所以在其中可以获取到控件的宽高等属性。有时候因为网络或则其他原因,会导致对控件进行设置时,设置的元素还未更新,这时候可以使用postDelay的方法延后一点点的时间,如100毫秒,用户感觉不出来,又能顺利拿到自己要的数值更新控件。
-
本地日志系统
Logger的功能不算强大,但是分层清晰,可扩展性强,原本就实现了写到文件和写到控制台的模块,基本上根据这两个模块进行扩展改造能实现一般的日志系统所需要的功能,如果要求的日志系统没有太多的功能要求的话,可以选择这个,代码量少,可读性好,扩展简单。
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
//线程名 main
Thread.currentThread().getName();
//获取栈顶的类名称 LoginActivity
trace[0].getClassName();
//栈顶的方法名称 onDataCallback
trace[0].getMethodName();
//栈顶的文件名称 LoginActivity.java
trace[0].getFileName();
//栈顶的代码的具体位置,行数 155
trace[0].getLineNumber();
//打印结果
Thread:main LoginActivity$2$1.onDataCallback (LoginActivity.java:155)
-
SpannableStringBuilder
该类可以实现对一串字符串中的某几个字进行单独设置,比如设置颜色,下划线,字号,插入图片,设置点击事件等等,这样我们便可以将一些原本需要多个TextView的布局用一个TextView来实现,不过要注意,设置的属性类是一次性用品,不能够一个属性类使用多次,例如:
//此处colorSpan和colorSpan2属性完全一致,但是如果重复使用则会出现失效的情况,如:
// spannableString.setSpan(colorSpan, 15, 21, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// spannableString.setSpan(colorSpan, 15, 21, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//这样便会出错,所以我们这样使用:
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.append(getString(R.string.login_phone2));
spannableString.append(getString(R.string.login_person_rule));
spannableString.append("和");
spannableString.append(getString(R.string.login_privacy));
ForegroundColorSpan colorSpan = new ForegroundColorSpan(getResources().getColor(R.color.color_white));
ForegroundColorSpan colorSpan2 = new ForegroundColorSpan(getResources().getColor(R.color.color_white));
spannableString.setSpan(colorSpan, 15, 21, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(colorSpan2, 22, 28, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-
CountDownLiveData
订阅者中模式中的被订阅者,与一般被订阅者不同的是,它能与Activity的生命周期绑定,防止出现内存泄漏等情况,无需我们手动去释放停止它,当Activity被销毁时,会自动销毁,在安卓中可以使用其代替一般的被订阅者。
-
Thread.UncaughtExceptionHandler
捕捉系统异常信息,即崩溃日志
1.实现该接口,并实现其uncaughtException方法,在该方法中可以获取到错误信息,我们可以对错误进行我们自己的处理
2.在代码中设置我们自己的UncaughtExceptionHandler为异常日志处理器
public void init(Context context) {
mContext = context;
//获取系统默认的处理器
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
//设置自己的CrashHandler为系统默认的
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread t, Throwable e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
//获得报错的信息内容
String errorMessage = sw.toString().replaceAll("<br>","\r");
//做完自己的处理后,依旧把错误交给系统类处理
mDefaultHandler.uncaughtException(t, e);
}