Android个人小结与记录,,,

587 阅读8分钟

一。检索技巧,ctrl+shift+n,搜索类,搜索类上一级的文件夹,

二。使用structure

三。问题记录

1.直接使用findViewById(R.id.text)).setText(mBus.toString());会找不到setTextview方法,用成员变量写法就没问题

四。总结

Never use the native Fragment class (android.app.Fragment)

If you are already using AndroidX, use androidx.fragment.app.Fragment (otherwise consider a migration to AndroidX)

If you don’t want to use AndroidX yet, simply use the Support Lib (android.support.v4.app.Fragment)

五。检索(限定搜索 +)

例如: +rxjava2

六。断点调试

程序无法debug,原因:程序中的断点过多

解决办法:ctrl+shift+F8,去掉程序中多余的断点

七。重写

继承:

父类方法为抽象方法时,子类必须重写(实现)所有父类的抽象方法; 父类方法为普通方法时,子类可以重写父类方法,也可以不重写。

八。实现接口:

抽象类可以不用 普通类必须全部重写。

九。抓包:

flidder抓包记得,手机安装安全证书(不安装导致手机https请求出现问题)

十。adb调试:

D:\learning\DouYinDemo>e:
E:\>cd E:\Users\admin\AppData\Local\Android\Sdk\platform-tools

(mac环境)
cd
cd Library/Android/sdk/platform-tools

之后就可以在窗口中使用adb命令啦

十一。国外教学视频

找到设置-字幕-(*语)自动生成,选择后,重新点击设置-字幕,这时候会多出一个自动翻译。选择自动翻译可以将英文字幕翻译为中文。

十二。macbokpro Androidstudio设置代理(不同于win环境)

1.端口:1087

十三。PermissionsDispatcher插件

1.到需要到activity或fragment中,alt+insert,generate runtime permissions

2.添加内容(如例子中需要权限的方法为testdemo)

3.手动添加权限检查,可放在oncreatview或点击事件中(重点)

MainActivityPermissionsDispatcher.testDemocheckWithPermissionCheck(this);

十四。rxjava

1.被观察者发布,subscribe接收。 被观察者subscribeOn,观察者observeOn。 流的概念

2.自己的任务都同步写,线程切换交给Rx。

3..subscribe(new Action1< Long>(){})创建并存储nested class,其中任何非静态嵌套(内部)类都引用了包含类的实例 – 如Activity的实例. 非静态内部类属于某个实例的。

rxjava主要是对(所发射)数据流的操作,rxjava+retrofit是做了封装。(目前的理解是给一个固定的数据源发射过去,相应处理后,观察者回调...其实dagger也是对数据的加工,从需要指令到生产实例...MVVM中ViewModel数据变化->view变化,只关心viewmodel的数据就好)

十五。mac使用Android studio

1.mac环境打开studio容易发热。与内存无关(内存够),主要原因是cpu占用多。建议jdk设置为embedded jdk。

2.Reformat Code快捷键option+command+L。

3.智能提示快捷键option+enter。

查看隐藏文件command+shift+.

十六。内存泄露

1.成员变量,属性

当这个Activity被finished后,延时发送的消息会继续在主线程的消息队列中存活,直到他们被处理。这个message持有handler对象,这个handler对象又隐式持有着SampleActivity对象.直到消息被处理前,这个handler对象都不会被释放, 因此SampleActivity也不会被释放。

2.在Java中,匿名类的静态实例不会隐式持有他们外部类的引用

3.静态内部类的实例不会隐式持有他们外部类的引用(引用就是当前的一个实例对象)。(自定义一个静态内部类handler,new一个成员变量)

4.如果你需要在Handler内部调用外部Activity的方法,那么让Handler持有一个Activity的弱引用(WeakReference)是正确的解决方案(注入一个弱引用activity)。

5.static修饰的成员变量,如果不把它设置为null,GC不会回收这个对象

6.栈(变量)堆(方法区)常量池(常量)------GC会回收

7.单例对象的生命周期比较长,相当于应用程序Application的生命周期

ActivityManager 单例添加Activity实例对象引发的内存泄漏(注入弱引用activity)

8.垃圾回收机制

1). 新生代
新生代的目标就是尽可能快速的收集掉那些生命周期短的对象
2). 老年代
老年代存放的都是一些生命周期较长的对象,就像上面所叙述的那样,在新生代中经历了N次垃圾回收后仍然存活的对象就会被放到老年代中。
3). 永久代
永久代主要用于存放静态文件,如Java类、方法等。永久代对垃圾回收没有显著影响,

9.static静态成员: 在类加载的时候,类加载完成,就分配完空间;直到类被卸载时空间被回收(属于类的,这个类的所有对象公用)

非静态成员: 创建对象的时候分配空间; 对象变为垃圾空间被回收的时候被销毁(属于某个对象的)

十六。handler机制

1.Looper(传送带,循环器)每个线程只能有一个Looper,只能有一个Message Queue,1个Looper可绑定多个handler

2.Message Queue(储存所绑定handler发送的消息)

3.handler(工人。发消息到所绑定的Message Queue,处理所绑定Looper派发的且自己所发送的消息)

4.Message(消息。类比eventbus的message,bundle)

5.如果是在子线程中创建的handler对象,就必须调用Looper.prepare(),Looper.loop()

6.异步:handler发送消息所在位置的线程----->handler所绑定的线程

十六。事件分发机制

1.最下的view在最顶层,最内的view在顶层

2.点击时,点击事件从最底层(activity)往最顶层(view)分发,默认不拦截事件

3.根据手指所点的位置,通常手指所在位置的顶层view处理事件

4.如果手指所在位置的顶层view没有消费事件(没有写点击事件等等,给别人机会去消费),原路返回去查找看能否消费事件(事件回传给父容器的onTouchEvent)

5.如果事件回传也没人消费事件(就是没反应),如同点击在空白view上

十六。自定义view

1.重点: 构造方法,画笔,onDraw,onMeasure

2.onTouch,onTouchEvent,onClick区别

(1)执行顺序来讲dispatchTouchEvent > onTouch > onTouchEvent > onClick。

(2)onclick就是一个点击事件,onTouch,onTouchEvent对他没有影响。

十八。lifecycle

1.观察者模式,2.管理生命周期

getLifecycle().addObserver(...);

十九。组件化

1.build.gradle修改:

(1)com.android.library (2)注释applicationId

2.AndroidManifest.xml:处理启动页

3.引入aar

二十。手机文件目录

1.getExternalFilesDir()获得手机外部存储

如果没有插入内存卡的话,一般外部存储的私有目录就是:
/storage/emulated/0  (文件管理>手机存储)  /Android/data/app package name

2.getFilesDir()获得手机内部存储

/data/data/app package name
(未root手机访问不到,可在Android studio中查看)

3.android中图片的三级cache策略(内存、文件、网络)

不同于内存缓存,磁盘缓存对应着文件,存储在手机内部存储。

二十一。组件和布局

1.BroadcastReceiver

(1)注册(设置action),解绑,发布广播,onReceive接收广播。类比eventbus。

(2)BroadCastReceiver的生命周期很短暂,当接收到广播的时候创建,当onReceive()方法结束后销毁。

(3)本地广播,只在App内部传播。

2.Service

(1)juejin.cn/post/684490…

(2)在service中注册动态广播

(3)当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用。

3.cardivew布局模版

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:layout_marginLeft="4sp"
    android:layout_marginTop="2dp"
    android:layout_marginRight="4dp"
    android:layout_marginBottom="2dp"
    android:clickable="true"

    android:foreground="?android:attr/selectableItemBackground"
    app:cardBackgroundColor="#ffffff"
    card_view:cardCornerRadius="5dp"
    android:translationZ="5dp"
    card_view:cardElevation="2dp">
       
</androidx.cardview.widget.CardView>

二十二。美工

1.UI交付的文件通常是基于某个版本(如iPhone6)进行设计,标注为px。开发人员需要在这个基准版本中将px换算成dp或pt,然后适配其他手机机型。

2.屏幕适配 (1)今日头条适配方案。

(2)SmallestWidth(最小宽度)限定符适配方案,指的是 Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。

二十三。android studio中程序崩溃无法查看log

logcat:Show only selected application可以改为选择No Filters。

二十四。 snippetslab

1.注意,通过teamview,粘贴windows至Mac snippetslab的模版代码不可用(报错非法字符:‘\u2028’) 2.Mac端到Mac snippetslab的模版代码可用,可粘贴至Mac开发工具,可通过teamview粘贴至windows。

二十五。 keytool

1.查看(测试工程的abc.jks位于项目根目录下)

keytool -v -list -keystore abc.jks

2.JKS 密钥库使用专用格式,迁移到行业标准格式 PKCS12

keytool -importkeystore -srckeystore abc.jks -destkeystore abc.jks -deststoretype pkcs12

二十六。 笔记

1.报错Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)'

出现问题的原因:大家都很容易把View写出小写view。那么这样就会报错。

2.一个字节Byte对应8位(bit),一位(bit)对应二进制(0或1)

字节流通常按字节数组读取,字符流通常按行读取

在Java中数据要被序列化为字节流,存储在文件中或在网络上传输,必须继承Serializable接口。

3.协程(启动:GlobalScope.launch) 协程是一个对象,这个对象包含一段代码,他再哪个位置启动,就在哪个位置执行 anko的doAsync内代码会在子线程中执行

command+shift+f,全局查找,记得取消选择File mask: