JAVA部分:

//jdk、jre、jvm三者的关系是什么?

 1.jdk是整个Java的核心,包含了jre、Java开发工具和Java基础类库;
 2.jre是Java运行时环境,包含了jvm和Java核心类库;
 3.jvm是Java虚拟机,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,它是整个Java
    实现跨平台运行的最核心的部分,能够运行以Java语言写的程序。

//jvm由哪些部分组成(基础)?
   jvm由类装载器、执行引擎、运行时数据区组成。
  参考:https://blog.csdn.net/know9163/article/details/80574488

//堆和栈的区别?
   1.栈:存放所有局部变量(基本数据类型变量和对象的引用变量);(线程私有的)
   2.堆:存放new出来的对象和数组以及全局变量;(线程共有;堆中所有的实体都有内存地址值,栈内存中的引用通过地址值指向该地址)

//方法区?
  1.方法区同堆一样,是jvm中一块内存区域,且线程共享;
  2.方法区用来存储类信息、常量、静态变量(类变量)、方法。
    参考:Java方法区、栈及堆_非丨空的博客-CSDN博客_java方法区

//常量池?

   1.静态常量池:class文件中的常量池,包括两种常量,字面量和符号引用,字面量比较接近Java语言层面的常量,也就是我们
     常提到的常量,如static final String str= “常量”,符号引用则是编译层面的概念,包括三类常量:类和接口的全限定名,字段
     的名称和描述符,方法的名称和描述符
   2.运行时常量池,属于方法区的一部分,class文件常量池中的字面量和符号引用在类加载完成进入方法区后被存到运行时
     常量池中,运行时常量池具有动态性,Java允许编译期常量池的内容进入运行时常量池,运行时产生的常量也可放入池中,
     如String的intern方法(调用intern方法,编译器会将字符串添加到常量池中,并返回指向该常量的引用)
    3.注意:常量池是介于栈和堆外的另一种独立的内存管理空间,相同内容常量池中永远只有一份,基本数据类型、对象的引用
       都存在栈中,执行速度快;包装类型,对象存储,new出来的对象都是存储在堆中,Byte,Short,Integer,Long,Character这5
       种整型的包装类只是在对应值小于等于127时才可使用对象池。超过了就会自动申请空间创建对象。而String是个较为特殊的
       包装类型,直接用=“”创建的数据是存放在常量池,且无论数据大小都不会申请空间创建,除非使用new关键字。

//静态变量(类变量)-->静态代码块-->构造代码块(按运行顺序排列)
   1.静态变量(类变量)在类加载时被调用;
   2.静态代码块构在类加载时被调用;
   3.构造代码块在每次创建对象时被调用;
    参考:构造代码块与静态代码块(静态初始化块)_非丨空的博客-CSDN博客

//守护线程与非守护线程?
   1.守护线程指为其他线程服务的线程,非守护线程又叫用户线程
   2.当所有非守护线程结束后,无论有没有守护线程,jvm都会自动退出;
   3.可在start()方法前,调用setDaemon(true)开启一个守护线程。

//int和integer的区别?
  1.integer是int的包装类,int是基本数据类型;
  2.integer需要实例化后才能使用,int可以直接使用;integer的默认值为null,int的默认值为零;
  3.当new一个Integer integer时,integer实际上是Integer对象的引用,存在栈中,然后堆内存中会生成一个integer对象,并分
     配一个地址,由integer指向该地址;而int则是直接存储数据值。

//==和equals的区别?
  1.==比较的是基本数据类型的值是否相等、引用类型变量的地址是否相等;
  2.equals属于object方法,默认情况下等同于==;重写情况下,如String方法的equals,比较的是字符串内容是否相同。

//hashCode?
  hashCode()是object中的方法,返回的是一个对象地址的哈希值,同一个对象的哈希码一定相等,不同对象的哈希码也有可能
  相等,并且默认如下规则:
   1.两个对象equals,hashCode一定相等;
   2.两个对象不equals,hashCode有可能相等;
   3.两个对象hashCode相等,不一定equals;
   4.两个对象hashCode不相等,一定不equals;
由此:如果重写equals方法,也需要重写hashCode方法

//多态?
  1.实现多态的三个条件是继承、重写、父类引用指向子类对象;
  2.父类引用指向子类对象,指声明是父类,实际指向的是一个子类的对象;
  3.简单描述就是:在实际执行期间判断所指向对象的实际类型,根据其实际类型调用其相应的方法。
  4.增强类型扩展性,降低类型之间耦合,利于维护。

//内部类
  1.定义:把定义在另一个类的内部的类叫做该类的内部类;
  2.访问规则:内部类可以直接访问外部类的成员变量,包括私有成员变量;外部类访问内部类必须创建对象;
  3.分类:成员内部类,可以使用外部类中所有的成员变量和成员方法;常用修饰符private;
                 创建对象时:

 //成员内部类不是静态的:外部类名.内部类名 对象名 = new 外部类名.new 内部类名();​//成员内部类是静态的:外部类名.内部类名 对象名 = new 外部类名.内部类名();    

           成员内部类经典题(填空),请在三个println 后括号中填空使得输出25,20,18

  class Outer {public int age = 18;    class Inner {public int age = 20;    public viod showAge() {int age  = 25;System.out.println(age);//空1System.out.println(this.age);//空2System.out.println(Outer.this.age);//空3}}} 

局部内部类,定义在一个方法或作用域里面的类;局部内部类访问局部变量需要加final修饰;
                 静态内部类,使用static 修饰的内部类(一般类不能使用static进行修饰);
                                        不能直接使用外部类的非静态成员变量和成员方法,必须使用对象调用;
                                        非静态内部类会隐式的持有外部类的引用;
                 匿名内部类,使用new 类名或接口的方式创建的类叫做匿名内部类,是内部类的简化写法,本质是继承该类或实现接
                                        口的子类匿名对象;
         4.使用内部类的原因:
                 封装性;
                 实现多继承;
                 匿名内部类实现回调;
                 解决继承和实现接口出现同名方法的问题。
      参考:java内部类有什么作用? - 知乎

//多线程
   1.开启方式:继承Thread类和实现runnable接口,区别:runnable是数据共享的,Thread数据不共享;
   2.常用方法:sleep()---start()---不需要手动唤醒,不释放对象锁;wait()---notify()、notifyAll()---需要notify唤醒,释放对象锁,需要在同步代码块中执行;
   3.线程池:
corePoolSize: 线程池中核心线程的数量。
maximumPoolSize:线程池中最大线程数量。
keepAliveTime:非核心线程的超时时长,当系统中非核心线程闲置时间超过keepAliveTime之后,则会被回收。如果ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,则该参数也表示核心线程的超时时长。
unit:keepAliveTime这个参数的单位,有纳秒、微秒、毫秒、秒、分、时、天等。
workQueue:线程池中的任务队列,该队列主要用来存储已经被提交但是尚未执行的任务。存储在这里的任务是由ThreadPoolExecutor的execute方法提交来的。
threadFactory:为线程池提供创建新线程的功能,这个我们一般使用默认即可。

  • 分类:
     1、newSingleThreadExecutor :
         创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行;
     2、newFixedThreadPool :
           创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待;
     3、newScheduledThreadPool :
           创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行;         
     4、newCachedThreadPool :
           创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

//面向对象六大设计原则
     1.单一职责:一个类只负责一项职责;
     2.里氏替换原则:子类继承父类进行功能扩展的时候尽量不要改变父类已实现好的方法(必要时可使用final关键字);
     3.依赖倒置原则:一个类应该依赖接口而不是依赖具体的实现类,核心是面向接口编程;
     4.接口隔离原则:针对不同的功能类尽量定义不同的接口,对接口进行细化;
     5.迪米特法则:对于被依赖的类来说,尽量将自己的逻辑封装在类的内部,对外提供public方法,不对外泄漏信息;
     6.开闭原则:对扩展开放,对修改关闭。

//设计模式:
     1.单例模式(懒汉式--线程安全要加锁<双重锁,线程安全,多线程情况下能保持高性能>,饿汉式---线程安全)
     2.简单工厂模式:对多个实现了同一接口的类使用一个统一的工厂类去创建实例(一个抽象产品,一个工厂方法);
     3.工厂方法模式:苹果手机(屏幕)||三星手机(屏幕)--三星手机工厂|| 苹果手机工厂
                                   针对不同的实现类创建多个工厂类;(一条产品线)
     4.抽象工厂模式:苹果手机(屏幕、电池、耳机)||三星手机(屏幕、电池、耳机)--手机工厂:苹果工厂||三星工厂
                                    一个工厂;(多条产品线)
     5.建造者模式:
             应用场景:1.产品类内部非常复杂,因为调用顺序不同或参数不同而产生不同作用或对象;
                                2.初始化一个对象时,参数过多,或者很多参数具有默认值;
             例子:bike被继承mobike、ofobike,build被继承mobikeBuild、ofoBuild,  Director指挥build具体创建不同产品
     6.代理模式:用代理类去实现原始类的功能
             1.静态代理:程序运行前.class文件已经生成;
             2.动态代理:程序运行中通过反射机制自动生成代理类。
     7.观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象对象都得到通知并被自动
        更新。角色:Observer抽象观察者(订阅者),Observerble抽象被观察者(被订阅者),具体观察者,具体被观察者。

//泛型
     1.泛型即“参数化类型”,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,然后在调用时传入具体的类型。
     2.分类:泛型类、泛型接口、泛型方法;
     3.限定泛型类型变量:(public class TypeLimitForClass<T extends List & Serializable>{}
                                          (public static<T extends Comparable<T>>T getMin(T a, T b) {})

//反射
      Java的反射是指程序在运行期间可以拿到一个对象的所有信息。

//countDownLatch:
     countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。

(补充中。。。)

Android部分:

//Android四大组件?
activity、service、contentProvider、broadcastReseiver

//activity:
  生命周期:
     1.正常情况下:onCreate()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestroy()-->onRestart();
     2.横竖屏切换:设置android:configChanges="orientation|keyboardHidden|screenSize"时,切换横竖屏只会调用
   onConfigChanged;其他情况下或不设置configChanges,切换横竖屏生命周期会重新走一遍,并且在onDestroy()之前会调
         用onSavedInstanceState()来保存信息,在重新进入activity时调用onRestoreInstanceState()接收保存的信息;
     3.A跳转到B:A:onPause()-->B:onCreate()-->B:onStart()-->B:onResume()-->A:onSaveInstanceState-->A:onStop()
        B没有完全遮挡住A: A:onPause()-->B:onCreate()-->B:onStart()-->B:onResume()-->A:onSaveInstanceState
     4.按下Home键或被完全覆盖,onpause()-->onStop()-->onRestart()-->onStart()-->onResume();
     5.下拉状态栏、popupwindow、弹出Toast和AlertDialog不改变生命周期;

  activity和fragment生命周期:activity引导fragment生命周期创建,fragment引导activity销毁:  
        Activity -- onCreate() ,
        Fragment -- onAttach() -> onCreate() -> onCreateView() -> onActivityCreated

.

Activity -- onStart()

        Fragment -- onStart()

Activity -- onResume()

        Fragment -- onResume()


       销毁时是 Fragment 带领 Activity 执行生命周期的方法:

        Fragment -- onPause()

        Activity -- onPause()


Fragment -- onStop()

        Activity -- onStop()


Fragment -- onDestroyView() -> onDestroy() -> onDetach()

        Activity -- onDestroy()

  Activity的四种启动模式:
    
standard:默认启动模式
     singleTop:栈顶模式,进入同一实例会走onNewIntent()(如新闻或阅读类APP的内容页);
     singleTask:栈中唯一,只会创建唯一实例,并且会移除它上面的所有实例,
                              再次进入会走onNewIntent() (如浏览器主页);
     singleInstance:新栈模式,再次进入会走onNewIntent()(如闹钟);

  Fragment数据传递:
     
1.采取接口回调的方式进行数据传递;
     2.广播或使用三方开源框架:EventBus。
    
//service:
  1.startService():开启服务,startService()-->onCreate()-->onStartCommand()-->onDestroy(),多次调用
     startService(),onCreate只会调用一次,而onStartCommand()会调用多次;调用stopService()会调用onDestroy()销毁服务;
     一旦启动服务,除非手动调用stopService()关闭服务,否则服务一直运行。
  2.bindService(new intent(context,service),mConnection,context):绑定服
             务,bindService()-->onCreate-->onBind()-->unBind()-->onDestroy();
      服务跟随activity的生命周期,当activity关闭,服务也随之关闭;
      使用serviceConnection获取到binder返回的service实例,然后灵活调用service中的方法;
      bindService()的好处是可以更加便利的操作service中的多个方法。
  3.前台服务(使用startForeground()即可开启前台服务--20秒响应)、后台服务(普通服务--200秒响应)

//contentProvider:
  步骤:1.创建需要对外提供的数据数据库和数据表;
             2.新建类继承contentProvider,重写6个抽象方法,创建uriMatcher定义URI匹配规则;
             3.在manifest中注册provider;
             4.在其他应用中获取contentReceiver,实现对contentProvider提供的数据进行增删改查(contentResolver.query);
             5.也可以注册contentObserver,通过新建类继承contentObserver,用来监听对应uri的数据变化(非必须)。

//broadcastReceiver:
     1.分类:
                 a.系统广播和自定义广播;
                 b.定义广播(发送方式):标准广播和有序广播;
                 c.注册广播接收器方式:动态注册和静态注册。
     2.注册方式:静态注册(也叫隐式注册,不受其他组件生命周期影响,即使应用程序被关闭,也能接收广播,耗电,占内
        存);动态注册(不耗电,不占内存,但是需要调用unregisterReceiver手动关闭,不用在manifest中注册);
     3.安卓8.0静态注册失效解决:
        方法1.使用:setComponent(“项目包名”,“receiver的全类名”)来指定包名和类名;
        方法2.使用hook
将所有发送出去的广播都加上FLAG_RECEIVER_INCLUDE_BACKGROUND标志。
     4.注意:需要在10s内处理完onReceive中的所有工作,onReceive中一般不进行耗时操作,如果需要处理耗时操作,应当通
         过intent传递给service进行处理(也不要在onReceive中开启线程进行耗时操作,否则10s后该线程会变成
         空线程,从而导致任务的丢失。同样的,也不要使用bindService来绑定服务);
     5.前台广播超时时间是10秒,后台广播是60秒。

//应用间安全机制,exported、intentFilter、permission机制
      1.exported:设置是否允许其他应用程序访问;
      2.intentFilter:设置匹配规则,包括action、category、data;
      3.permission机制:安卓权限机制,可用来校验不同应用组件间访问权限。

//AlertDialog,popupWindow区别
      1.AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做其他事情;
      2.PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当
            我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。

//Context
      
         1.定义:上下文,它描述一个应用程序的资源和类,是一个抽象类,通过它我们可以获取应用程序的资源和类;作用:弹出
            Toast、启动Activity、启动Service、发送广播、操作view,操作数据库等等
         2.种类:application、service、activity;
         3.作用域:能用application的优先使用application的context;操作UI相关的(跳转activity、弹出dialog等)尽量使用activity的
            context;使用application的context启动一个activity时需要指定目标activity的FLAG_ACTIVITY_NEW_TASK,这时会为
            它创建一个任务栈,而此时activity是以singleTask模式启动的;
         4.内存泄漏:1.单例模式使用activity的context导致内存泄漏;2.view持有activity的引用,再调用静态资源,导致activity
             销毁时无法释放内存;3.尽量不要在activity中使用非静态内部类,因为非静态内部类会隐式的持有外部类的引用,如果
             使用非静态内部类,可将外部类实例作为弱引用持有。

//安卓窗口机制:
          1.窗口结构:
              Activity-->Window-->PhoneWindow-->DecorView(LinearLayout)
               -->ViewStub、FramLaout、FramLayout(-->mContentParent)
          2.首先window是在activity的attach方法中创建的,并与windowManager进行绑定;然后调用了oncreate方法,在        
             setContentView中去加载xml文件;最后在handleResumeActivity中通过windowManager.addView添加
             decorView,然后在viewRootImpl中绘制view树。
             https://www.processon.com/diagraming/5e956d9a637689282f653a80             参考:https://www.jianshu.com/p/40a9c93b5a8d

//view的绘制流程
      1.onMesure测量:
            1.测量的三种模式:EXACTLY(match_parent)、AT_MOST(wrap_content)、UPSPECIFIED
            
2.测量顺序:子view测量完成之后再测量父view;
            3.测量方式:父容器通过调用measureChildWithMargins(),然后调用child.measure测量子view;子view的大小由父view
               的MesureSpec和子view的 LayoutParams共同决定;
            4.最后必须要调用setMeasureDimension()设值,不然会报错。
       2.onLayout布局:
             1.ayout过程是父布局容器布局子view的过程;
             2.父类容器必须重写onLayout方法,然后应该为每一个子view调用layout方法进行布局;所有的叶子view都是由父容器负
                责布局的;
             3.通过调用View中的setFrame()方法,根据Left、Top、Right、Bottom四个点相对父布局的位置确定子view的位置,是
                真正执行布局任务;
             4.如FramLayout中的onLayout方法,通过layoutChildren()方法去遍历子view进行布局。
             参考:【朝花夕拾】Android自定义View篇之(一)View绘制流程 - 宋者为王 - 博客园
        3.onDraw绘制:
                view的draw方法中有两个核心方法,onDraw、dispatchDraw;onDraw负责绘制,大部
                控件重都写了该方法,负责具体的绘制,dispatchDraw是父容器viewGroup通过调用drawChild绘制子view的方
                法;onDrawForeground负责绘制前景。
                登录 | ProcessOn

//安卓事件分发机制
          事件分发机制有三个核心方法:
          1.dispatchTouchEvent:分发事件,返回true表示点击事件被本身或子view消耗;返回false表示该view没有子view或者子
             view没有消耗事件
          2.onInterceptTouchEvent:拦截事件,在dispatchTouchEvent方法中调用,用来判断是否拦截事件,返回true表示拦截
             事件,并将事件交由本view的onTouchEvent进行处理,且该事件不再向下分发;返回false表示不拦截,继续调用子
             view的dispatchTouchEcent向下分发;
          3.onTouchEvent:处理事件,在dispatchTouchEvent方法中调用,返回结果表示是否消耗当前事件,返回true表示消耗,
             且事件不再向上传递;返回false表示不消耗,事件回传到父容器。
      
用伪代码简单表示:

public boolean dispatchTouchEvent(MotionEvent ev) {boolean handled = false;if (onInterceptTouchEvent(ev)) {handled = onTouchEvent(ev);} else {handled = child.dispatchTouchEvent(ev)}return handled;
}  

事件分发流程简图:

参考:https://www.jianshu.com/p/e6ceb7f767d8                 https://www.jianshu.com/p/1378b334ee85

//滑动冲突解决思路:
   1.外部拦截,重写父容器的onInterceptTouchEvent()方法,根据不同的触发场景判断是否需要拦截事件;
   2.内部拦截,通过内部view.getParent().requestDisallowInterceptTouchEvent(true)方法设置父容器不拦截事件。

//自定义view
      1.自定义控件分类:组合控件,继承系统控件,直接继承view
      2.继承系统控件和直接继承view自定义控件流程:
              1.重写构造方法,四个构造方法,前两个是必须要重写的;直接new一个Custom View时会调用一个参数的
                 构造方法,在xml文件中使用Custom View会调用两个参数的构造方法,第三个和第四个构造函数一般是我们
                 主动调用的;构造方法中的四个参数:
                            第一个是context;
                            第二个参数是AttributeSet,属性值集合,用来获取xml文件的属性;
                            第三个参数defStyleAttr,当前Theme中的包含的一个指向style的引用.当我们没有给自定义
                                       View设置declare-styleable资源集合时,默认从这个集合里面查找布局文件中配置属性值.传入0表
                                       示不向该defStyleAttr中查找默认值;
                             第四个参数是defStyleRes,这是一个指向Style的资源ID,但是仅在defStyleAttr为0或者defStyleAttr
                                       不为0但Theme中没有为defStyleAttr属性赋值时起作用.
                        (小结:自定义属性的优先级:在布局xml中直接定义 > 在布局xml中通过style定义 > 自定义View所在的
                                           Activity的Theme中指定style引用 > 构造函数中defStyleRes指定的默认值)
                 2.自定义属性,并在构造方法中通过context.obtainStyledAttributes中获取属性值;
                                      参考:
Android自定义View构造函数详解_低调小一的博客-CSDN博客_自定义view构造方法
                3.view的绘制流程:onMeasure()测量,onLayout()布局,onDraw()绘制;

//安卓异步(线程)
  1.Handler+Thread或HandlerThread方式,使用handler.post和handler.sendMessage;
  2.AsyncTask:
          参数:<Params, Progress, Result>;
          方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()。
  3.线程池:newSingleThreadExecutor、newFixedThreadPool、newScheduledThreadPool 、newCachedThreadPool;
         参考:https://www.jianshu.com/p/7b2da1d94b42
  4.intentService:是继承于service并处理异步请求的一个类,内部其实是使用handlerThread开启了一个工作线程,通过
     handler发送消息到handlerThread的消息队列中进行处理;多次启动startService会以工作队列的方式在intentService中
     的onHandleIntent回调方法中执行;当任务执行完后,IntentService 会自动停止,不需要我们去手动结束;
  5.eventBus、广播、接口、runOnUiThread等。

//Canvas(画布)
  安卓中的画布,可以用来画各种图形,如矩形、圆形、扇形、圆弧、直线、点等

  • canvas.drawArc ()//(扇形)
  • canvas.drawCircle()//(圆)
  • canvas.drawOval()//(椭圆)
  • canvas.drawLine()//(线)
  • canvas.drawPoint()//(点)
  • canvas.drawRect()//(矩形)
  • canvas.drawRoundRect()//(圆角矩形)
  • canvas.drawVertices()//(顶点)
  • canvas.drawPath()//(路径)
  • canvas.drawBitmap()// (位图)
  • canvas.drawText()// (文字)

//Paint(画笔)
     安卓中的画笔,可以设置画笔的颜色、样式、文本样式等

//jetPack框架
     jetPack是一组开发库的集合,分为四个模块(基础、架构、行为、界面),其中架构模块包括LifeCycles、LiveData、
     ViewModel、Navigation、Paging、Room、WorkManager核心库
     //LifeCycles:生命周期感知组件,自定义接口实现LifeCycleObserver,在生命周期方法上添加注解@OnlifeCycleEvent
        (LifeCycle.Event.ON_START),在activity中使用getLifeCycle().addObserver添加一个观察者。
     //ViewModel:
         1.解放控制器(activity和fragment);2.保存数据(数据不会丢失);3.ViewModel可以和liveData联动。
    //LiveData:自动更新数据,进一步独立控制器
    //DataBinding:双向绑定

//RXJava
   创建操作符(create、just):创建出被观察者
   转换操作符(map):将被观察者返回类型转换成其他类型并发送出去
   组合操作符(concat):将多个观察者发送的事件组合起来一起发送
   功能操作符(delay):设置满足不同功能的事件(如延迟发送)
   过滤操作符(filter):事件序列中过滤一部分事件,满足的则返回true---发送,不满足则返回false---不发送
   条件操作符(all、takeWhile):满足条件则返回true---发送,不满足则返回false---不发送

//Material Design设计风格
    1.coordinatorLayout+AppBarLayout+ToolBar:
      coordinatorLayout:
        1.这是一个父控件,继承自ViewGroup,它是加强的FramLayout, 可以协调其它控件并实现控件之间的联
          动。通过在其直接子View上设置behavior来实现子View的不同交互效果。一般作为一个界面的根布局,来协调
          AppbarLayout,ToolBarLayout以及ScrollView之间的联动;
        2.CoordinatorLayout的使用核心是behavior;
    2.FloatingActionButton:悬浮按钮
    3.BottomSheet

//动态加载:在应用程序运行时,动态加载一些程序中原本不存在的可执行文件并运行这些文件里的代码逻辑。可执行文件总的
     来说分为两个,一种是动态链接库so,另一种是dex相关文件(包括apk和jar文件)。插件化和热修复都属于动态加载技术。

//插件化:属于动态加载技术,主要用于解决应用越来越庞大以及模块之间的解耦,所以小项目中一般用的不多。
                   (用于业务复杂,模块间的解耦,应用间接入,65536限制,内存占用大)
                      三种方式:插桩式、Hook技术、反射

//安卓各版本特性:
     4.4(稳定性):沉浸式
     5.0(样式):Material Design样式(样式);只能显示绑定到服务,取消隐藏绑定服务
     6.0(安全性):动态权限;去除HttpClient;apk验证;低电耗模式和待机模式
     7.0(快捷性):视图缩放;低电耗优化;移除三项隐式广播;取消应用间文件共享权限;
     8.0(简洁、体验):通知样式;画中画模式;静态注册广播失效

//安卓第三方库
    通用类:RxJava,butterknife,rxpermissions,eventbus
    网络类:okhttp,RxJava+Retrofit,Gson,FastJson,
    框架类:jetPack(ViewModel,LiveData,LifeCycle) , DataBinding,
    图片加载类:Glide,Picasso,ImageSelector(图片选择器)
    UI控件类:swipebacklayout(activity滑动返回),bottom_tab(底部tab切换库),BottomSheet(底部弹窗列表库)
                       ImmersionBar(沉浸式状态栏库),PickerView(条件选择器),MPAndroidChart(安卓图表类控件库)
                       BaseRecyclerViewAdapterHelper(通用适配器)、SwitchLayout (activity动画切换)、SmartRefreshLayout、
                       PickerView、Lottie(动画库)、
     异常:bugly

//安卓动画:
        1.视图动画:视图动画的作用对象是View,支持四种动画效果,分别是平移动画,缩放动画,旋转动画,透明度动画,
                通过在anim文件夹下创建set文件来使用;
        2.帧动画:帧动画是顺序播放一组预先定义好的图片,不同于View动画,系统提供了另外一个类AnimationDrawable来使用
                帧动画,通过在drawable文件夹下创建xml文件animation-list放置一组图片来使用动画;
        3.属性动画:通过不断更改view的属性来达到动画效果,使用ObjectAnimator.ofFloat来实现控件的alpha、rotation、
                scaleX、translationY四种效果。

//Android的4种文件类型Java,class,dex,apk
     Java文件-----应用程序源文件
     class文件------Java编译后的中间目标文件
     Dex文件-----Android平台上的可执行文件
     Apk文件-------Android上的安装文件

//JVM、Dalvik(JIT)、ART(AOT)三个虚拟机的关系
    JVM--java虚拟机(加载.class文件)
    Dalvik--安卓4.4版本之前虚拟机,加载dex文件,对应JIT,即运行时编译
    ART--安卓4.4版本之后开始引入的虚拟机,采用的是AOT,即预编译技术(5.0之后全面使用ART虚拟机,Dalvik被弃用)

//加密
     对称加密:对称加密指的就是加密和解密使用同一个秘钥,常见的对称加密算法:DES,3DES,AES等等;
     非对称加密:一把作为公开的公钥,另一把作为私钥。公钥的加密,只有私钥才能解密。私钥的加密,只有公钥才能解密;
                           常见的非对称加密算法:RSA,ECC
      Hash算法(摘要算法):Hash算法的特点是单向不可还原,用户可以通过hash算法对目标信息生成一段特定长度的唯一    
                         hash值,却不能通过这个hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验
                         等。只要源数据不同,算法得到的摘要必定不同。常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA
      数字签名:数字签名用来保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。
数字签名是 A将原始明文通过 hash 算法得到摘要,这个摘要是不可逆的;将明文加密,连同摘要一起发送给B;B接收到后解密,得到这个摘要 a 和加密的明文,再将加密明文解密得到原始明文,然后通过同一 hash 算法得到新的摘要 b,比较 ab 就可得知在传输过程中是否被更改过。
因此数字签名能够验证信息的完整性。如果中途数据被纂改或者丢失。那么对方就可以根据数字签名来辨别是否是来自对方的第一手信息数据。

//https(HTTP + SSL / TLS)
对称加密和非对称加密结合方式,使用SSL协议进行传输

//HTTP的三次握手
为什么要进行第三次握手?
    1.为了防止服务器端开启一些无用的连接增加服务器开销;
    2.防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

//okhttp
不能在主线程中响应

//上传大文件
1.减小单个录制文件的大小;
2.分块上传,按固定长度将文件分成多块的字节数组进行上传;
3.断点续传:传输过程异常中断时,再次发起传输时,终端先去服务器查询相应文件的最后传输成功位置,然后从这个位置开始继续传输,避免重复传输导致的网络开销。

//断点续传
  在字节读取的地方加上字节长度的记录,在发起请求的时候将字节长度传入。

//安卓跨进程方式(四大组件)
   1.activity:使用隐式启动activity,匹配action、category和data;
   2.contentProvider:使用contentReceiver调用query返回一个cursor对象,然后对contentProvider提供的数据进行增删改查;
   3.广播:可以通过发送系统广播和自定义广播向其他进程进行通信(通过intent.setAction()方法);
   4.AIDL服务:编写aidl文件,使用aidl服务。

//安卓ANR场景和解决方案
场景:
    1.
键盘输入事件和触摸无响应5s;
    2.BroadCastReciver 前台处理超过10s 后台超过60s;
    3.Server 前台处理超过20s 后台超过200s;
    4.activity主线程中进行耗时操作。
原因:
     1.主线程耗时操作;
     2.CPU、内存、IO 占用过高,资源耗尽;
解决方案:
     1.避免在ui线程进行耗时操作:
     2.不要在广播的onReceive方法中进行耗时操作:
     3.service中开启子线程进行耗时操作;内容提供者不要进行耗时操作;
     4.及时释放资源,避免内存泄漏。

//安卓进程保活
进程分类:
   前台进程:正在与用户交互的进程;
   可见进程:拥有不在前台、但仍对用户可见的 Activity(已调用 onPause());
   服务进程:某个进程中运行着一个Service且该Service是通过startService()启动的,与用户看见的界面没有直接关联;
   后台进程:在用户按了"back"或者"home"后,程序本身看不到了,但是其实还在运行的程序,比如Activity调用了onPause方法。
进程保活:
    1.开启一个一像素Activity;
    2.使用前台服务:
           a.对于 API level < 18 :调用startForeground(ID, new Notification()),发送空的Notification ,图标则不会显示;
           b.对于 API level >= 18:在需要提优先级的service A启动一个InnerService,两个服务同时startForeground,且绑定同样
              的 ID。Stop 掉InnerService ,这样通知栏图标即被移除。
     3.使用两个进程相互唤醒。

//安卓长连接(推送,直播)
   1.使用http,开启定时器,不断请求实现长连接;
   2.使用第三方服务(如极光推送、百度推送、友盟等第三方服务实现长连接)。

//安卓适配
   1.使用dp、sp单位(在不同分辨率下适配效果不理想);
   2.smallestWidth适配:指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识
      别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件(values-sw360dp);
   3.今日头条的适配方案(屏幕总宽度(px)/设计稿宽度(dp)= density,再根据设计稿上的宽高(dp)*density = 最终宽高
   (px));
   4.AndroidAutoSize方案。

   //安卓hook

  //AndroidStudio配置svn
   1.安装小乌龟
  

   2.打开setting中的version control;
   3.添加directory路径即可。

//adb命令
  1.adb version   adb版本信息
  2.adb install apk路径   安装apk
  3.adb uninstall apk包名   卸载apk
  4.adb devices 查看当前连接设备

//OOM
  1.内存泄漏或内存大小设置不当(堆溢出);
     1.处理内存泄漏(集合对象没清理造成的内存泄漏);2.图片太大,对图片进行压缩;3.手动回收内存或关闭资源,取消注
     册;4.adapter内使用缓存策略  ;5.手动分配堆内存大小。
   2.方法区溢出;
   3.栈溢出。
      1.无线递归或死循环,导致局部变量不停创建,导致栈溢出。

//TCP和UDP
   1.面向连接VS无连接;
   2.可靠VS不可靠;
   3.有序性,TCP利用seq序列号对包进行排序,udp没有;
   4.面向字节流vs面向报文。
  TCP应用场景:
效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。举几个例子:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。
   UDP应用场景:
效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)。
  //http和tcp的关系
   1.HTTP协议位于网络应用层,UDP协议位于网络传输层;
   2.TCP是基于UDP协议的;
   3.我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议

//socket
  1.它是计算机之间进行通信的一种约定或一种方式;
  2.包括本地IP地址、端口和远端IP地址、端口号。

(补充中。。。)

javaandroid相关推荐

  1. android ansi编码格式,如何将UTF字符串转换为ANSI并使用JAVA-ANDROID在SSD中创建ANSI文本文件...

    我在java中编写了一个Android应用程序以获取用户答案并将其保存在文件中. 问题是该文件保存在utf-8中. 最终用户将在IBM SPSS中打开这些文件,这是一个只能用ANSI(windows- ...

  2. 基于java-Android平台实现随心明信片系统演示【附项目源码+简要论文说明】

    基于java-Android平台实现随心明信片系统演示 欢迎页面 系统首先加载欢迎页面,作为开屏页,该页面通过加载显示布局文件的全局背景,背景选取明信片风格的图片给人以亲切的感觉,加载图片后,通过de ...

  3. android 自定义listpreference,java-Android,单击ListPreference项时显示对话框

    基本上,我有一个ListPreference,允许用户更改我的动态壁纸上某些文本的X位置. 它包含4个条目:顶部,中间,底部和手动输入X.前3个选项没问题,我只需在我的WallpaperService ...

  4. javaandroid知识点汇总整理(不定期更新)

    1 .java中,有的方法的参数类型是charsequence,这时候带入的参数实际上是字符串,这是怎么回事呢????? 答: CharSequence是String实现的一个接口,相当简单,就是要求 ...

  5. Android什么是函数,什么是函数响应式编程(JavaAndroid版本)

    什么是函数响应式编程(Java&Android版本) 函数响应式编程(FRP)为解决现代编程问题提供了全新的视角.一旦理解它,可以极大地简化你的项目,特别是处理嵌套回调的异步事件,复杂的列表过 ...

  6. android绑定java,Java-android数据绑定-找不到类android.view.data

    我试图在我的android应用程序中实现数据绑定,但是我遇到了以下问题: java.lang.ClassNotFoundException:找不到类" android.view.data&q ...

  7. [转]javaandroid线程池

    java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一) java多线程同步以及线程间通信详解&消费者生产者模式&死锁 ...

  8. Java-Android【2】-弹出对话框

    一.在Activity的方法中加入代码 new AlertDialog.Builder(this).setTitle("Title").setMessage("Messa ...

  9. Java-Android 之Hello World

    1.新建一个Android Project 2.2版本的 修改values下面的内容,为: <?xml version="1.0" encoding="utf-8& ...

  10. java与android https,Java-Android SSL https发布

    我在这里看到了很多类似的问题,但是找不到解决方案. 我有一个托管在x10 Premium上的Webservice PHP文件.我从他们那里购买了SSL证书,并且可以在浏览器和iPhone应用程序上通过 ...

最新文章

  1. linux 内核阻塞,linux内核阻塞IO
  2. linux下的定时任务 每天0点重置 tp5
  3. Linux复习资料——CentOS7下安装MySQL5.7.22(完整版本)
  4. IAAS云计算产品畅想-云主机产品内涵
  5. JUnit5 Maven 依赖项
  6. Nginx+PHP-FPM优化技巧总结(转发别人的,自己留着收藏个记录用)
  7. “我想再当一次 CEO,所以我离开了 IBM。”
  8. JS纯前端导出PDF及分页和使用window.print()保存PDF
  9. 沈阳工业大学计算机专业排名,中国的大学计算机专业排名。
  10. 台式计算机启动时 每次按f1,电脑开机时总是提示要按F1?云骑士告诉你如何解决...
  11. sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1064, “You have an error in your SQ
  12. Win10系统pin码忘记了?
  13. C# 固高Jog运动
  14. P4 Tutorial 安装
  15. 三种Android图片压缩方法 压缩到指定大小
  16. 30岁青年医生凌晨猝死:生死之外,其实都是小事!
  17. 教育技术学习《基于 CPS 模型的翻转课堂教学模式构建——以“JAVA 语言程序设计”课程为例》笔记
  18. Android系统签名简介
  19. 深入 WIN2000 注册表 (14) C O M +
  20. AutoCAD中我们如何进行创建和设置管理图层?

热门文章

  1. 2018 年秋季 10 月江苏省计算机等级考试回忆(三级偏硬-微机接口)
  2. 2020 京东全民养红包 全民营业 自动任务 一键完成 一键抢红包
  3. 室内定位技术:UWB、蓝牙、RFID和WIFI——谁将是主角
  4. 明日直播 | 关于人工智能技术,你想知道的都在这里
  5. Wine是什么-Wine能什么-Wine 工作原理
  6. Android 组件化架构概要,ffmpeg音视频开发实战陈超
  7. 在一个公司死磕10年是种什么体验?
  8. 爬虫2--爬取豆瓣网热映电影
  9. 【转】丰田栽了的原因,嵌入式软件工程师都该看看
  10. 【文献调研】慢病患者就医行为预测:就医选择行为有哪些?预测什么?如何预测?慢病患者?