-
Message msg = Message.obtain();
获取Message对象的最好方法是调用Message.obtain()或者Handler.obtainMessage(), 这样是 从一个可回收对象池中获取Message对象。这两种方式都比直接new一个Message对象在性能上更优越.
Message mess = Message.obtain(); mess.what =1; //mHandler.obtainMessage(1)与上两行的代码一样
-
多线程
多线程的应用在Android开发中是非常常见的,常用方法主要有:
继承Thread类;实现Runnable接口
Handler
AsyncTask
HandlerThread -
file.exists():如果存在的话返回“true”,否则就返回“false”
-
file.createNewFile():根据抽象路径创建一个新的空文件,当抽象路径指定的文件存在时,创建失败。
-
Permission denied : 动态权限问题
-
ComponentName:可以启动其他应用的Activity、Service.
ComponentName chatActivity =new ComponentName(param1,param2); param1:Activity、Service所在应用的包名 param2:Activity、Service的包名+类名 //使用 intent.setComponent(chatActivity); startActivity(intent);
-
将List用SharedPreferences存储
先将List转为Json:String str=new Gson.toJson( List );然后存储。 取数据:List = gson.fromJson(str, new TypeToken<List<T>>() {}.getType());
-
Arrays.equals() :比较两个数组元素是否相同
-
Char.IsLetter(char)用来判断字符char是否是字母
-
String 类中的 startsWith()函数,判断一个字符串是否是以某个指定参数开头的。
"Hello Kotlin".startsWith("Hello")
-
JSONObject,JSONArray,用opt代替get方法
取值为null时不会抛出异常
-
StringBuilder 使用builder.delete(0, builder.length())代替 new StringBuilder
只需要一个StringBuilder对象,delete后就可以重复使用,提升性能
-
文字改颜色:
String mStr = "<font color='#CCCCCC'>“</font>" + str + "<font color='#CCCCCC'>”</font>"; mTextView.setText(Html.fromHtml(mStr));
-
合并俩个数组
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 参数解释: src :要被合并的数组 srcPos:从被合并数组的哪里开始合并 dest:和并src的数组(最后合并完的数组) destPos:从dest的哪里开始加入src length: 加多少个src的数据 用法: System.arraycopy(nums2, 0, nums1, m, n); 将nums2(从下标0开始) 合并到 nums1(从下标m开始) eg: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6]
-
数组排序
sort(int[] a) sort(int[] a, int fromIndex, int toIndex) ...(还有其他数据类型) Arrays.sort(nums1);
-
关于Recyclerview的方法getItemViewType(int position)
设置Recyclerview每一个item的type类型,用于多类型Recyclerview; 设置后在onCreateViewHolder()方法中根据tpye return对应的viewHolder
-
Rect… rects
相当于 Rect[ ] rects ; 可以(new Rect(),new Rect(),)这样传入
-
Recyclerview 的方法
1. onViewRecycled()方法 在adapter中调用,(当Item被回收的时候调用) 如果调用viewHolder.setIsRecyclable(false); onViewRecycled不调用 2. onViewDetachedFromWindow (当Item离开这个页面的时候调用)
-
正则表达式,替换 .
//示例 1: //输入:address = "1.1.1.1" //输出:"1[.]1[.]1[.]1" address.replaceAll("\\.","[.]") 正则中一个单独的点表示任意字符,所有字符都作为分隔符当然不会有任何结果 \\.实际上被转义为两次,在java中被转换为一个'\'字符, 然后'\.'被传给正则,\.表示对点字符进行转义, 使.就表示字符'.',而不使用它在正则中的特殊意义
-
Android 布局细节
1. android:chipChildren="false" 裁剪子视图。 子视图的绘制是否可以超出边界。默认值为true,表示不超出边界,设置为false时,表示允许子视图超出边界。 例如:父控件最高是 50dp,子控件设置了60dp,android:chipChildren="false"时可以正常显示,即不裁剪。 2. android:clipToPadding="false" 例如:当你的recyclerview设置了paddingTop, 如果在item上设置android:clipToPadding="false",则item在滑动时无视recyclerview设置的这个padding
-
char 的ASCII码
int x= '1',x=49; int y= '0' ,y=48 ;可以利用 - ’0‘ 来计算真正的int值 int 和 char 可以互相强转
-
new String (char value[]) 和 Arrays.toString(arr [ ] )区别
char[] arr= {'a','b','c'}; Arrays.toString(arr); //[a, b, c] new String(arr); //abc
-
判断是否在主线程
boolean isMainThread =Lopper.myLopper()==Lopper.getMainLopper();
-
Handler 总结
1. Handler的背后有Lopper、MessageQueue支撑,Looper负责消息分发,MessageQueue负责消息管理。 2. 在创建Handler之前一定需要先创建Looper 3. Looper有退出的功能,但是主线程的Looper不允许退出 4. 异步线程的Looper需要自己调用 Looper.myLooper.quit() ;退出 5. Runnable 被封装进了 Message,可以说是一个特殊的Message 6. Handler.handleMessage() 所在的线程是 Looper.loop() 方法被调用的线程,也可以说成Looper所在的线程, 并不是创建handler的线程。 7. 使用内部类的方式使用Handler 可能会导致内存泄露,即便在Activity.onDestroy() 里移除延时消息。所以必须写成静态内部类。
-
触发 onSaveInstanceState(Bundle outState)的条件
1. 当用户按下HOME键时 2. 从最近应用中选择运行其他的程序时 3. 按下电源按键(关闭屏幕显示)时 4. 从当前activity启动一个新的Activity时 5. 屏幕方向切换时 在前4种情况下,当前activity生命周期为: onPause--onSaveInstaceState -onStop 最后一种如果没有设置configChanges,会调用onDestroy()
-
Activity 的启动(framework)
1. 手机开机->Linux内核加载完成->init 进程启动->frok出zygote进程->zygote开启一个子线程:开启一个app(进程) 2. 每个App其实都是一个单独的虚拟机,一个单独的进程 3. 其他应用所在进程都是zygote的子进程 4. systemServer也是一个进程,也是由zygote进程fork出来的 5. framework 里面两大非常重要的进程:systemServer 和 zygote 6. SystemServer :系统里面重要的服务都是在这个进程里开启:比如 ActivityManagerService、packageManagerService 、WindowManagerService等。 7. ActivityManagerService ,简称AMS,服务端对象,负责系统中所有Activity的生命周期。 8. App 与 AMS 通过Binder 进行Ipc通信;AMS和zygote 通过Socket进行ipc通信
-
取消activity 过度动画
overridePendingTransition(0,0) 不想要Activity到另一个Activity的过度动画时候可以设置,这样切换Activity时 就没有过度动画了
-
利用 & (与运算符)判断奇偶性
num & 1==1 (判断num是否是奇数), eg:(7 & 1)==1 ,7&1=1,所以返回true,7是奇数; (6 & 1)==1 ,返回false (写成二进制与运算就是原理) num >> 1 :右移一位,相当于除以2. eg: 6 >> 1 =3 ;0110 -> 0011 x&1 位运算 等价于 x%2;x%2 取余运算,即皆可用于判断数字奇偶性
-
java 中用方法 十进制和二进制的互相转化
二进制转十进制 :int x=Integer,parseInt(“101”,2); // x=5;
十进制转二进制 : String s=Integer.toBinaryString(5); //s = “101” -
android 正则表达式使用
str.matches("\\d+") // \\d+ 匹配多位数
-
解决软键盘弹出顶起view问题:android:windowSoftInputMode=“adjustPan|stateHidden”
-
xml 背景 (渐变色圆形)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!--实现应用背景颜色渐变-->
<gradient
android:endColor="#4643F4"
android:gradientRadius="@dimen/dp_20"
android:startColor="#6383FF"
android:type="radial" />
<size
android:width="@dimen/dp_20"
android:height="@dimen/dp_20" />
</shape>
- 软件盘顶起view问题
1.顶起
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_PAN);
2.挤压
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_RESIZE);
3.不顶起
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_NOTHING);
- bottomSheet 上边圆角不显示问题
1.设置background为透明
<style name="zsmart_bottom_sheet_dialog_style" parent="Theme.Design.Light.BottomSheetDialog">
<item name="bottomSheetStyle">@style/zsmart_bottom_sheet_style_wrapper</item>
</style>
<style name="zsmart_bottom_sheet_style_wrapper" parent="Widget.Design.BottomSheet.Modal">
<item name="android:background">@android:color/transparent</item>
</style>
2.应用样式
BottomSheetDialog bottomSheet = new BottomSheetDialog(this,R.style.zsmart_bottom_sheet_dialog_style);
bottomSheet.setContentView(R.layout.zhome_goods_info_position_bottom_sheet);
bottomSheet.show();
- 防止activity过度绘制: getWindow().setBackgroundDrawable(null);
- 字节流 - 16进制互转
// byte转十六进制字符串
public String bytes2HexString(byte[] bytes) {
String ret = “”;
for (byte item : bytes) {
String hex = Integer.toHexString(item & 0xFF);
if (hex.length() == 1) {
hex = ‘0’ + hex;
}
ret += hex.toUpperCase(Locale.CHINA);
}
return ret;
}
// 将16进制的字符串转换为字节数组
public byte[] getHexBytes(String message) {
int len = message.length() / 2;
char[] chars = message.toCharArray();
String[] hexStr = new String[len];
byte[] bytes = new byte[len];
for (int i = 0, j = 0; j < len; i += 2, j++) {
hexStr[j] = "" + chars[i] + chars[i + 1];
bytes[j] = (byte) Integer.parseInt(hexStr[j], 16);
}
return bytes;
}
s = s.trim(); //除去开头和末尾的空白字符
s.split("\\s+") //正则匹配连续的空白字符作为分隔符分割
Arrays.asList() // 可以把数组转成list
Collections.reverse(wordList); //list翻转
String.join(" ", wordList)//将list的item用空格连接起来返回一个String