Java 和 Kotlin

Ivony:

1.几乎所有的程序设计语言都是和库绑定的。

2.一个优秀的程序设计语言不在于他有多少语法元素和特性,而在于这个语言的语法元素是否符合直觉。更进一步的就是是否符合你的直觉。符合直觉,或者说你的直觉和语言设计者的口味一致的语言,不单用起来爽,学起来也快。

圆胖肿:

1.Java在一大堆通用编程语言中,特性最少,关键字最少,符号最少,也就是说,Java是学习门槛和难度最低的通用编程语言。

Akiyama Mio:

1.Kotlin并没有不火,但也没有大火,一直都是不温不火的状态,我个人的判断是将来可能还会继续不温不火,或者是慢牛状态。

2.Kotlin会大火吗? 如果没有Flutter的话,我认为会,现在有了Flutter,可以跨Android和iOS平台,还可以编译web和桌面版二进制,多平台GUI通吃且体验一致,对于开发者来说简直没有理由不使用Flutter啊,所以个人认为Flutter会逐渐挤压和蚕食一部分原生Android开发的市场份额。

Zhao Jun:

不可否认Kotlin在安卓开发领域做得不错,但是Kotlin相对Java在后端开发领域优势不大。

1.Kotlin的空安全语法跟现有Java库之间的互动不是很平滑,问号、双惊叹号出现频率比较高。

2.Kotlin不需要处理checked exception,会导致很多潜在问题不能在编译期被发现和处理,直接进入产品环境。

3.类里面不能定义static field比如log对象,想要的话得弄companion object有点多此一举。

4.开发环境的各种小问题,如idea经常卡住特别是Java跟Kotlin混合使用的情况。影响团队生产效率。对于有洁癖的程序员来说,一个项目混合使用两种后端语言一言难尽。


参考链接:

Kotlin语言现在怎么不火了? – Ivony的回答 – 知乎

Kotlin语言现在怎么不火了? – 圆胖肿的回答 – 知乎

Kotlin语言现在怎么不火了? – Akiyama Mio的回答 – 知乎

Kotlin语言现在怎么不火了? – Zhao Jun的回答 – 知乎

Android模拟器实现串口通信调试

Android模拟器实现串口通信调试

Android模拟器挂载虚拟串口进行通信之踩坑记

使用AndroidStudio自带模拟器挂载串口不能接收超过8字节的数据


注:使用AndroidStudio自带的模拟器,发送8字节以内的数据是ok的,一旦超过8字节模拟器就会挂掉,后来使用了Genymotion模拟器,这个问题就没有了。

雷电模拟器安装Xposed

1.下载工具包

2.解压工具包到D盘根目录

3.打开雷电模拟器,执行Shell命令

adb remount /
adb push D:\xposed /system
adb shell
cd /system/xposed
chmod 777 script.sh
sh script.sh

4.安装成功

**************************
Xposed framework installer
**************************
- Checking environment
 Xposed version: 89
- Placing files
cp: bad 'system/priv-app/XposedInstaller/XposedInstaller.apk': No such file or directory
chmod: /system/priv-app/XposedInstaller/XposedInstaller.apk: No such file or directory
chcon: /system/priv-app/XposedInstaller/XposedInstaller.apk: No such file or directory
- Done
```

参考链接:

雷电模拟器4.0(android 7.1 x86_64) xposed安装

雷电安卓模拟器解决Could not load available ZIP files.Pull down to try again问题

获取Android设备上的USB设备

import android.content.Context;
import android.os.storage.StorageManager;

import java.lang.reflect.Method;

public class USBUtil {

    public static String getUSBPath(Context context) {
        StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
        try {
            // 通过反射调用getVolumeList,获取所有挂载的设备(内部sd卡、外部sd卡、挂载的U盘)
            Method getVolumeListMethod = StorageManager.class.getMethod("getVolumeList");
            Object[] volumes = (Object[]) getVolumeListMethod.invoke(storageManager);

            Class<?> storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
            // 通过反射调用getPath、isRemovable
            Method getPathMethod = storageVolumeClazz.getMethod("getPath");
            Method isRemovableMethod = storageVolumeClazz.getMethod("isRemovable");
            if (volumes != null && volumes.length > 0) {
                for (Object volume : volumes) {
                    String path = (String) getPathMethod.invoke(volume); // 获取路径
                    boolean isRemovable = (boolean) isRemovableMethod.invoke(volume);// 是否可移除
                    if (isRemovable) {
                        return path;
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "/";
    }
}

参考链接:
获取Android设备上的所有存储设备

Android Fragment 重叠问题

缘起

首先,笔者的主Activity中包含了多个Fragment,通过show、hide来切换展示。当笔者切换到其他的APP,操作一段时间后,返回到当前APP,有很大几率会出现Fragment重叠现象。

缘由

首先,在Activity的生命周期中,当Activity不在前台展示时,如果此时其他的APP需要使用内存,系统会杀掉该APP的进程,当用户重新进入该APP时,系统会重新创建Activity。

Activity不在前台展示时会保存Fragment的状态,当系统重新创建Activity时会恢复之前保存的Fragment的状态。

缘解

方案一:在Activity的onCreate方法中判断savedInstanceState是否为空,不为空则使用系统保存的Fragment。

public class MainActivity extends AppCompatActivity {
    Fragment fragment;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            fragment = getSupportFragmentManager().findFragmentByTag("fragment");
        } else {
            fragment = new Fragment();
            getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, fragment, "fragment").commit();
        }
    }
}

方案二:在Activity的onCreate方法中,调用super方法时直接传null,不使用保存的状态。

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(null);
}

参考资料:

Android fragment 重叠问题——通过hide,show方式导致的解决方法

解决Activity重新刷新后Fragment的show、hide失效问题

深入理解Activity的生命周期