实习期间小问题备忘 1

问题记录

1. Mac 上zip文件加压出现cpgz文件的解决方法:

解压缩zip格式,出现.cpgz文件,循环往复,解决方法

  • 命令行 unzip,但是文件会加压到根目录,不方便;
  • 使用unarchiver第三方解压软件,解压zip即可

2. mac上有些文件的扩展名是隐藏的

比如说txt。

3. 安装apktool

zoezhang@ali-ac87a32d0e28 bin$ sudo chmod +x /usr/local/bin apktool.jar apktool
zoezhang@ali-ac87a32d0e28 bin$ sudo apktool

4. .so文件的安装位置?

  • 最终APK文件中的lib/abi目录中
  • 通过PackageManager安装后,在小于Android 5.0的系统中,.so文件位于app的nativeLibraryPath目录中;在大于等于Android 5.0的系统中,.so文件位于app的nativeLibraryRootDir/CPU_ARCH目录中。

5. 打包失败的问题

androd-gradle-plugin 版本不对

classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'com.alipay.android:android-gradle-plugin:1.5.0.2.6.1'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

6. 开发环境

分清楚什么是日常、预发、和线上环境;学习哆啦A梦调试工具

7. mac下ping

会一直ping下去,需要按control + C停止

8. instanceof关键字

java二元操作符,作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型。
举例:

public class Bill{}
public class PhoneBill extends Bill{}
public class GasBill extends Bill{}

//传入一个bill对象  一个方法处理两种子类  ----并不推荐的用法
public double calculate(Bill bill){
  if(bill instanceof PhoneBill){
  }
  if(bill instanceof GasBill){
  }
}

在Android中,instanceof关键字常用于在Fragment中getActivity调用Activity方法时,检查所获得的Activity是否是Fragment所attach的Activity,

9. Android 反射技术(引用网上资料):

  • 运用反射我们可以运行时加载、探知使用编译期间完全位置的classes。换句话说,Java程序可以加载在运行时才得知名称的class,获悉其完整构造方法,并生成其对象实体、或对其属性设值、或唤起其成员方法。

  • Java的反射机制是在编译时并不确定是哪个类被加载了,而是在程序运行的时候才加载。使用的是在编译期并不知道的类。这样的编译特点就是java反射。

  • 如果有AB两个程序员合作,A在写程序的时需要使用B所写的类,但B并没完成他所写的类。那么A的代码是不能通过编译的。此时,利用Java反射的机制,就可以让A在没有得到B所写的类的时候,来使自身的代码通过编译。

  • 反射就是把Java类中的各种存在给解析成相应的Java类。要正确使用Java反射机制就得使用Class(C大写) 这个类。它是Java反射机制的起源。当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。

为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念:

  • 静态编译:在编译时确定类型,绑定对象,即通过。
  • 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,降低类之间的藕合性。

一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用安装,只需要在运行时才动态的创建和编译,就可以实现该功能。它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。

  • JAVA的动态加载的机制就是通过ClassLoader来实现的,ClassLoader也是实现反射的基石。ClassLoader是JAVA提供的一个类,顾名思义,它就是用来加载Class文件到JVM,以供程序使用的。

  • 但是问题来了,ClassLoader加载文件到JVM,但是Android是基于DVM的,用ClassLoader加载文件进DVM肯定是不行的。于是android提供了另外一套加载机制,分别为 dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader,区别在于 PathClassLoader 不能直接从 zip 包中得到 dex,因此只支持直接操作 dex 文件或者已经安装过的 apk(因为安装过的 apk 在 cache 中存在缓存的 dex 文件)。而 DexClassLoader 可以加载外部的 apk、jar 或 dex文件,并且会在指定的 outpath 路径存放其 dex 文件。

10. Fragment

管理回退栈

11. H5和native app

  • native app使用原生系统内核,iOS或者Android,直接在系统上操作,使用API;* H5 app是先调用系统的浏览器内核,相当于是在网页上进行操作,相对原生APP稳定性稍差,速度较慢,但是动态性很强;
  • Weex和React Native

12. Classesloader()的双亲委托模式

for java:

  • classloader:用于加载class文件到JVM,以供程序使用,动态加载的机制就是通过classesloader实现的。
  • classesloader—— bootstrapclassesloader(启动类加载器)
  • 每一个自定义的classloader都必须继承classloader这个抽象类,每个Classloader都会有一个parent Classloader,我们可以看到Classloader中有一个getparent()方法,
    这个方法用来返回当前ClassLoader的parent,注意,这个parent不是指的被继承的类,而是在实例化该ClassLoader时指定的一个 ClassLoader,如果这个parent为null,那么就默认该ClassLoader的parent是bootstrap classloader,这个parent有什么用呢?
    http://www.cnblogs.com/xxbcoder/p/5112632.html

13. Android分发机制

将一个事件传递给一个具体的view去处理的整体流程和机制
Activity ---- ViewGroup ----- View 处理

14. 反射机制

利用反射机制解耦的原理就是动态创建对象,先加载指定的类,再实例化对象。
java反射机制是在运行状态的时候,对于任意一个类,都能够知道这个类的所有属性和方法。
动态获取信息和动态调用对象的方法成为java语言的反射机制。
也就是在程序运行时实例化对象,而我们平时是加载了类之后实例化对象。

Reflection机制允许程序在正在执行的过程中,利用Reflection APIs取得任何已知名称的类的内部信息,包括:package、 type parameters、 superclass、 implemented interfaces、 inner classes、 outer classes、 fields、 constructors、 methods、 modifiers等,并可以在执行的过程中,动态生成Instances、变更fields内容或唤起methods。

string str = 'abcc'  
Class cl = str.getclass()  
Class c2 = Class.forName("java.avt.Buttion")  

15. android 的动态加载之classloader

  • ClassLoad而是所有ClassLoader的最终父类。传入了一个父构造器,默认父构造器为一个PathClassLoader且此PathClassLoader父构造器为BootClassLoader
  • 双亲委派模型
  • 父构造器加载不成功,才会在自己的findclas中进行加载。逻辑尽量写在findclasses中。

16. RecycleView的基本用法

  • 列表页面:RecycleView,Adapter,实现Adapter的getViewType,onCreateViewHolder,onBindViewHolder,还有一些Item操作,绑定,设置对应的LayoutManager。

17. 开源网络框架

  • OKhttp
    一个处理网络请求的开源项目。
    功能:get,post使用,文件上传下载,加载图片,支持回调,返回对象,对session的保持。

18. px和dp

  • px是像素,屏幕上一个物理的像素点,不建议使用,有兼容性问题
  • dp是最常用的尺寸单位,与像素密度密切相关,
    物理尺寸:1.5 2 分辨率 240340
    那么横向包含的像素密度是 240/1.5 纵向包含的 340/2
  • Android 定义了四种像素密度:120dpi,160dpi,240dpi,320dpi
    对应的dp到px的系数分别是0.75,1,1.5,2,这个系数乘以dp长度就是像素数。

19. Android 渐变蒙层

  • [图片添加阴影效果] (https://francisshi.github.io/2015/06/03/%E5%9B%BE%E7%89%87%E6%B7%BB%E5%8A%A0%E9%98%B4%E5%BD%B1%E6%95%88%E6%9E%9C/)
  • 项目中遇到情况,为了沉头清晰的白色的字体,需要为背景图片增加透明黑色的蒙版。

20. Charles

  • mac下常用网络抓包工具,在做移动开发时,为了调试与服务器端的网络通讯协议,需要截取网络封包来分析。
  • charles将自己设置成系统的网络访问代理服务器,所有的网络协议请求都通过它来完成,从而实现网络的封包和分析。

21. Fragment setArgument

创建Fragment对象 new Fragment(),不建议重载构造函数,因为当一个Fragment重新创建的时候,会调用Fragment的默认构造函数,不会调用你重载的构造函数。因此系统推荐使用Fragment.setArgument(Bundle)来传递参数。当Fragment销毁的时候,Bundle会保存下来,重新创建时根据Bundle来重新创建Fragment。

22. Android View中的getViewTreeObserver().addOnGlobalLayoutListener()

  • 获取view的宽度和高度的方法之一,在onCreate中无法获得一个view的高宽,view的组件布局在onResume回调完成,onGlobalLayoutListener是viewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被viewTreeObserver监听到,这个时候注册监听视图树的观察者,在视图树的全局事件改变时得到通知,viewTreeObserver通过getViewTreeObserver获得。
  • onGlobalLayoutListener,当视图树中某个视图可视状态发生改变时,要调用的回调函数接口类。

23. Fragment与Activity的通信 以及 viewpager

  • Fragment可以通过getActivity()方法获取到它所在的Activity的对象,然后可以查找Activity中的控件,Activity可以通过FragmentManager来查找它所包含的Fragment。
  • 事件回调:Activity响应Fragment事件

你可能感兴趣的:(实习期间小问题备忘 1)