Java,Android 基础知识

  1. Message msg = Message.obtain();

     	获取Message对象的最好方法是调用Message.obtain()或者Handler.obtainMessage(), 这样是
     从一个可回收对象池中获取Message对象。这两种方式都比直接new一个Message对象在性能上更优越.
    
    			Message mess = Message.obtain();  
                mess.what =1;  
                //mHandler.obtainMessage(1)与上两行的代码一样
    
  2. 多线程

    多线程的应用在Android开发中是非常常见的,常用方法主要有:
    继承Thread类;实现Runnable接口
    Handler
    AsyncTask
    HandlerThread

  3. file.exists():如果存在的话返回“true”,否则就返回“false”

  4. file.createNewFile():根据抽象路径创建一个新的空文件,当抽象路径指定的文件存在时,创建失败。

  5. Permission denied : 动态权限问题

  6. ComponentName:可以启动其他应用的Activity、Service.

     ComponentName    chatActivity =new ComponentName(param1,param2);
    
     param1:Activity、Service所在应用的包名
    
     param2:Activity、Service的包名+类名
     //使用
      intent.setComponent(chatActivity);
      startActivity(intent);
    
  7. 将List用SharedPreferences存储

     	先将List转为Json:String str=new Gson.toJson( List );然后存储。
     	取数据:List = gson.fromJson(str, new TypeToken<List<T>>() {}.getType());
    
  8. Arrays.equals() :比较两个数组元素是否相同

  9. Char.IsLetter(char)用来判断字符char是否是字母

  10. String 类中的 startsWith()函数,判断一个字符串是否是以某个指定参数开头的。

    "Hello Kotlin".startsWith("Hello")
    
  11. JSONObject,JSONArray,用opt代替get方法

    取值为null时不会抛出异常
    
  12. StringBuilder 使用builder.delete(0, builder.length())代替 new StringBuilder

    只需要一个StringBuilder对象,delete后就可以重复使用,提升性能
    
  13. 文字改颜色:

     String mStr = "<font color='#CCCCCC'>“</font>" + str + "<font color='#CCCCCC'>”</font>";
     mTextView.setText(Html.fromHtml(mStr));
    
  14. 合并俩个数组

    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]
    
  15. 数组排序

    sort(int[] a)
    sort(int[] a, int fromIndex, int toIndex)
    ...(还有其他数据类型)
    
    Arrays.sort(nums1);
    
  16. 关于Recyclerview的方法getItemViewType(int position)

    设置Recyclerview每一个item的type类型,用于多类型Recyclerview;
    设置后在onCreateViewHolder()方法中根据tpye return对应的viewHolder
    
  17. Rect… rects

     相当于 Rect[ ] rects  ; 可以(new Rect(),new Rect(),)这样传入
    
  18. Recyclerview 的方法

    1. onViewRecycled()方法 
    在adapter中调用,(当Item被回收的时候调用)
    如果调用viewHolder.setIsRecyclable(false);   onViewRecycled不调用
    2. onViewDetachedFromWindow (当Item离开这个页面的时候调用)
    
  19. 正则表达式,替换 .

    //示例 1:
    //输入:address = "1.1.1.1"
    //输出:"1[.]1[.]1[.]1"
    address.replaceAll("\\.","[.]")
    
    正则中一个单独的点表示任意字符,所有字符都作为分隔符当然不会有任何结果
    \\.实际上被转义为两次,在java中被转换为一个'\'字符,
    然后'\.'被传给正则,\.表示对点字符进行转义,
    使.就表示字符'.',而不使用它在正则中的特殊意义
    
  20. 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
    
  21. char 的ASCII码

    int x= '1',x=49; int y= '0' ,y=48 ;可以利用 - ’0‘ 来计算真正的int值
    int 和 char 可以互相强转 
    
  22. new String (char value[]) 和 Arrays.toString(arr [ ] )区别

    char[] arr= {'a','b','c'};
    Arrays.toString(arr); //[a, b, c] 
    new String(arr); //abc
    
  23. 判断是否在主线程

    boolean  isMainThread =Lopper.myLopper()==Lopper.getMainLopper();
    
  24. 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() 里移除延时消息。所以必须写成静态内部类。 
    
  25. 触发 onSaveInstanceState(Bundle outState)的条件

    1. 当用户按下HOME键时
    2. 从最近应用中选择运行其他的程序时
    3. 按下电源按键(关闭屏幕显示)时
    4. 从当前activity启动一个新的Activity时
    5. 屏幕方向切换时
    
    在前4种情况下,当前activity生命周期为:
    onPause--onSaveInstaceState -onStop
    最后一种如果没有设置configChanges,会调用onDestroy()
    
  26. 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通信
    
  27. 取消activity 过度动画

    overridePendingTransition(0,0)
    不想要Activity到另一个Activity的过度动画时候可以设置,这样切换Activity时 就没有过度动画了
    
  28. 利用 & (与运算符)判断奇偶性

    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 取余运算,即皆可用于判断数字奇偶性
    
  29. java 中用方法 十进制和二进制的互相转化

    二进制转十进制 :int x=Integer,parseInt(“101”,2); // x=5;
    十进制转二进制 : String s=Integer.toBinaryString(5); //s = “101”

  30. android 正则表达式使用

    str.matches("\\d+") // \\d+ 匹配多位数
    
  31. 解决软键盘弹出顶起view问题:android:windowSoftInputMode=“adjustPan|stateHidden”

  32. 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>
  1. 软件盘顶起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);
  1. 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();
  1. 防止activity过度绘制: getWindow().setBackgroundDrawable(null);
  2. 字节流 - 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;
}
  1. s = s.trim(); //除去开头和末尾的空白字符
  2. s.split("\\s+") //正则匹配连续的空白字符作为分隔符分割
  3. Arrays.asList() // 可以把数组转成list
  4. Collections.reverse(wordList); //list翻转
  5. String.join(" ", wordList)//将list的item用空格连接起来返回一个String
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值