android
Last updated
Was this helpful?
Last updated
Was this helpful?
[TOC]
Android系统是由Andy Rubin创建的,基于linux,后来被Google收购了.有趣的是Android系统的命名都是以点心来命名的.
foss:Free and open source software (FOSS,自由开源软件) premium:产品本身免费下载,一般情况下也不会被标示为“免费软件”,因为想要体验完整的产品仍然是需要付费购买的(俗称内购)
形如xmlns:xxx="..."
:因为XML文件不仅仅用于Android,还可以用于很多地方,所以这句声明表示该XML文件用于Android的开发和布局(这也就是所有属性前都加了android:
的原因),也可以理解为命名空间(?)
而且,所有的布局文件中都需要加入xmlns开头的两个声明,否则不能正确运行.
更多信息(待研究):
还可以使用tools命名空间,帮助很大
比如tools:text
,相当于占位符,在预览的时候不会显示,而是用于动态展示.
@
一般表示指定某种资源
指定id:android:id = " @+id/ben_text_view"
指定id时,值以字母开头,不能有空格和特殊符号;其中的"+"号只有在第一次声明id的时候用到
指定图片路径:android:src = " @drawable/[pic_name]"
,不需要图片的扩展名
指定颜色
值@android:color/[color_name]
:指定Android标准颜色,比较有限
十六进制,支持所有颜色
谷歌推出的专为低配手机用的系统,相当于Android8的精简版
两者都是免安装的应用.只不过 Instant Apps 是基于 Android 操作系统的,微信小程序是基于微信 App 生态的,但本质上还是不一样的,Instant Apps 本质上还是原生 App,只不过允许你在下载安装之前,先体验下 App 部分模块的功能,觉得不错,适合你,那么你可以再下载安装,而微信小程序本质上不是原生应用,他是基于一种类似 React Native 的框架来达到原生的体验,而且只能在微信内部运行。 Instant Apps 体验更好,功能更强大,可以独立运行在手机上,而微信小程序没法独立运行,是基于微信生态下的应用,而且技术上也有一些限制。
Instant Apps的缺点
Instant Apps 深度链接的识别需要依赖 Google Play(但是国内需要梯子)
只支持 Android 平台,iOS 不支持
官方
https://www.android.com/
值得好好研究,特别是没有产品经理的时候.
大量使用无边框图片
元素间最好留一些空隙
不建议使用太多的风格和字体,一般3到4种即可
颜色也不要太多,特别是材料(倾向于使用大片的饱和色)
对于重要元素可以使用浮动,高亮等
关于文本和设备边缘的间隔:16dp最佳;文件之间的间隔:8dp最佳.
最好不要有启动动画
Company Domain:应用的唯一标识符,看起来像一个网址,一般填入的是[my_name].com
,这个值反转后就是应用发布后的包名(package name)(google app和手机会根据这个来识别你的应用?),所以必须是在全世界发布的app中都是唯一的才行.
project location:AS会创建一个默认位置,一般用它就好.
选择设备和版本
设备有手机和平板,TV,Wear,Glass等选项.选版本时选"help me choose"会出现不同版本的使用情况
选择模板
blank activity和empty activity
创建后的文件结构查看方式:推荐用Android
在手机上运行 大神推荐Nexus 5
开启开发者选项和USB调试
第一次需要点击版本号好几次(?),然后设置里就有开发者选项了.
usb连接
install derver(windows only):因为mac下默认是允许连接的
install apo
在模拟器上运行
第一次运行模拟器的时候可能会不正常,大部分问题都可以解决,但更推荐使用真机.
Android应用的界面使用布局(ViewGroup 对象)和微件(View 对象)层次结构构建。布局是一种不可见的容器,用于控制其子视图在屏幕上的位置。微件是界面组件,例如按钮和文本框。
嵌套布局会增加绘制界面所需的时间。
您还可以使用顶部或底部边缘创建水平对齐,不过,按钮在其图像周围包含内边距,因此如果您按照这种方式对齐这些视图,视觉对齐将是错误的。
关于接口,抽象类和具体类 接口是完全没有实现,抽象类是部分实现,具体类是完全实现;编写代码的时候具体用哪个要看情况.
该视图模式也是google官方推荐的模式,app目录里的文件大概如下
mainfests
AndroidManifest.xml
视图主文件,包含:
包名(package name)
应用组件:如activity name,intents,通知权限,最低api等
java
res:包含应用外观的所有内容
drawable:放置图片
layout:包含app设计和布局的xml
menu
mipmap:放置应用图标
values
分为隐式和显式Intent,显式就是指定具体的Intent,隐式就是不知道具体的,比如打开一个网页,不管哪个浏览器app,只要能打开网页就行.
可以设置更具体的一些信息,同时还要对没有可选的情况进行处理
类似于视图的容器,分类如下
线性布局(LinearLayout)
位置权重
类似于比例布局
如果权重为0,则宽高会使用设置的值
相对布局(RelativeLayout)
其中的子元素不设置的话默认会放在左上角.
子元素布局
用layout_xxx
来设置,比如相对于某个兄弟元素的左边可以用layout_toLeftOf
,较某兄弟元素下面用layout_below
,和父元素的右对齐可以用layout_alignParentRight
约束布局(ConstraintLayout)
Android Studio默认使用约束布局
根据日志的严重情况分为五个类别,分别是xxx,都接受两个参数,第一个是消息来自何处,一般填类名,第二个参数就是消息内容.
视图回收
ArrayAdapter
.nomedia
:作用是告诉系统和其他程序不要索引当前目录下的媒体文件。当然它只是一个约定,而不是强制性的,其他APP依然可以不遵守这个约定。
参考:
https://github.com/mzlogin/awesome-adb
ADB是什么:全称为Android Debug Bridge:android调试桥梁。具有安装卸载apk、拷贝推送文件、查看设备硬件信息、查看应用程序占用资源、在设备执行shell命令等功能
安装下载:
我们可以在android sdk安装目录的platform-tools目录下找到adb工具
brew cask install android-platform-tools
配置:环境变量
架构:ADB是一个C/S架构的应用程序,由三部分组成:
运行在pc端的adb client:命令行程序”adb”用于从shell或脚本中运行adb命令。首先,“adb”程序尝试定位主机上的ADB服务器,如果找不到ADB服务器,“adb”程序自动启动一个ADB服务器。接下来,当设备的adbd和pc端的adb server建立连接后,adb client就可以向ADB servcer发送服务请求;
运行在pc端的adb server:ADB Server是运行在主机上的一个后台进程。它的作用在于检测USB端口感知设备的连接和拔除,以及模拟器实例的启动或停止,ADB Server还需要将adb client的请求通过usb或者tcp的方式发送到对应的adbd上;
操作
开关
运行在设备端的常驻进程adb demon (adbd):程序“adbd”作为一个后台进程在Android设备或模拟器系统中运行。它的作用是连接ADB服务器,并且为运行在主机上的客户端提供一些服务;
使用:
查询已连接的设备和状态adb devices
,输出格式一般为serialNumberA stateA
serialNumber 即我们常说的 SN
state 有如下几种:
offline —— 表示设备未连接成功或无响应。
device —— 设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态。
no device —— 没有设备/模拟器连接。
unauthorized:未授权的意思,应该是未允许USB调试
状态可能有缓存,导致显示得不及时,目前能找到的解决办法是重启adb server
连接设备和电脑:
USB连接
Android 设备的开发者选项和 USB 调试模式已开启。
一般情况下会自动连接,如果没有,则关闭USB调试后再重新打开
连接成功后通过adb devices
可以看到该设备
无线连接:
prerequisites:设备和PC机已经接入局域网,并且设备有局域网的IP地址
让设备在某个端口监听TCP/IP连接
方法一:这一步可以借助USB连接来操作adb tcpip <port>
,比如adb tcpip 5555
(让设备在 5555 端口监听 TCP/IP 连接),之后就不需要USB了
方法二:也可以不借助USB,在设备的终端模拟器上操作
连接设备
断开 USB 连接(如果没用USB则忽略此步)
找到设备的 IP 地址,通过 IP 地址连接设备adb connect <device-ip-address>
,如adb connect 192.168.2.157
,连接成功后通过adb devices
可以看到该设备
使用完后断开连接adb disconnect <device-ip-address>
恢复USB调试adb usb
(没有则忽略此步)
adb shell
:发出shell命令,有两种使用方式,adb shell shellCommandA
是发出单个shell命令(无需进入远程shell),adb shell
是启动交互式shell(需要进入远程shell)。
使用shell命令之前,推荐先adb root
:以 root 权限运行 adbd,再运行 adb shell
,命令行提示符变成#
.相应地,如果要恢复 adbd 为非 root 权限的话,可以使用 adb unroot 命令。
有些手机 root 后也无法通过 adb root 命令让 adbd 以 root 权限执行,比如三星的部分机型,会提示"adbd cannot run as root in production builds",此时可以先安装 adbd Insecure,然后 adb root 试试。
参数-s
:多个设备的时候用于指定具体某个设备adb -s emulator-5554 shell
查看可用的Unix命令行工具列表adb shell ls /system/bin
:Android 提供了大多数常见的 Unix 命令行工具,--help
参数可获得大多数命令的帮助。许多 shell 命令都由 toybox 提供.
调用 Activity 管理器 (am):可以执行各种系统操作,如启动 Activity、强行停止进程、广播 intent、修改设备屏幕属性,等等。语法可以是adb shell am xxx
(无需进入远程shell),也可以是am xxx
(需要先进入远程shell)
打开appadb shell am start
-n componentA
:通过组件名,即软件包名/activity名
打开app
终止app
正常终止adb shell am kill pkgA
:终止与 package(应用的软件包名称)关联的所有进程。此命令仅终止可安全终止且不会影响用户体验的进程。也就是说如果应用在前台使用,是不会终止的,只有应用在后台的时候才会被终止。
强行终止adb shell am force-stop pkgA
:强行停止与 package(应用的软件包名称)关联的所有进程
实时查看正在运行的app的包名和activity
方法一adb shell dumpsys activity activities
(推荐)
方法二adb shell logcat | grep ActivityManager
dumpsys
:等同getprop
,获取在连接的设备上运行的所有系统服务的诊断输出,就是从系统的各种配置文件中读取信息。
查看屏幕密度
adb shell getprop ro.sf.lcd_density
adb shell wm density
查看屏幕尺寸adb shell wm size
ps
根据包名获取运行进程的pidadb shell pidof pkgA
,如com.hypergryph.arknights
,未运行时返回空字符串
应用管理
查看应用列表
adb shell pm list packages
安装apkadb install [-lrtsdg] <path_to_apk>
,比如adb install xxx.apk
安装原理:adb install 实际是分三步完成:
push apk 文件到 /data/local/tmp。
调用 pm install 安装。
删除 /data/local/tmp 下的对应 apk 文件。
安装状态
成功
失败
卸载adb uninstall 包名A
,比如adb uninstall com.xxx.xxx
文件管理
复制设备里的文件到电脑adb pull <设备里的文件路径> [电脑上的目录]
,如果省略电脑上的目录,则默认复制到当前目录。
设备上的文件路径可能需要 root 权限才能访问,如果你的设备已经 root 过,可以先使用 adb shell 和 su 命令在 adb shell 里获取 root 权限后,先 cp /path/on/device /sdcard/filename 将文件复制到 sdcard,然后 adb pull /sdcard/filename /path/on/pc。
复制电脑里的文件到设备adb push <电脑上的文件路径> <设备里的目录>
模拟按键/输入
比如模拟点击://在屏幕上点击坐标点x=50 y=250的位置。adb shell input tap 50 250
比如使用 adb shell input keyevent keyCodeA
命令,不同的 keycode 能实现不同的功能
滑动解锁:如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 input swipe 来解锁。
向上滑动手势解锁举例:adb shell input swipe 300 1000 300 500
输入文本:在焦点处于某文本框时,可以通过 input 命令来输入文本adb shell input text hello
查看日志:Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。
录制屏幕:录制屏幕以 mp4 格式保存到 /sdcard:adb shell screenrecord /sdcard/filename.mp4
重新挂载 system 分区为可写(需要 root 权限):/system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作,所以需要重新挂载它为可读写。
进入 shell 并切换到 root 用户权限。adb shell
、su
查看当前分区挂载情况:mount
查看连接过的 WiFi 密码(需要 root 权限)adb shell su cat /data/misc/wifi/*.conf
问题:
5037为adb默认端口,若5037端口被占用
以win为例
找到使用该端口的进程Pidnetstat -aon|findstr 5037
通过PID找到对应的进程名(便于定位,可以跳过)tasklist /fi "PID eq pidA"
终止pidtaskkill /pid 3172 /f
课程1A:视图VIEWS
使用大驼峰写法
显示文字的叫TextView
默认背景颜色是透明色
宽高参数值wrap_content
:根据文字的长度自动调整宽高
属性textStyle
:指定文字是粗体或斜体
属性textAlignment
:文字在视图中对齐的方式
属性textSize
:文字大小,推荐使用sp
属性fontFamily
:设置字体
属性textColor
:文字颜色
图片=>ImageView
属性scaleType
:图片的对齐方式
center
:居中,不会对图片大小做修改
centerCrop
:居中,同时自动调整图片大小填充满整个屏幕(保持原有的纵横比?)
按钮=>Button
others
XML语法
一般这样写:<xxx ... />
;有子元素的时候,这样写阅读体验更好:<xxx ... > /xxx>
属性
因为是XML,所以属性要用引号(双引号)包裹
更改TextView
推荐使用dp单位,这样在不同分辨率的手机上看到的大小是一样的;如果用px就不一样.
推荐所有可触摸的目标,比如button的宽高最少为48dp
修改颜色
Android自带的颜色是一个有限集,比如blue
就没有,但是支持十六进制的所有颜色(Hex color).写法是#xxxxxx
解决错误
宽度和高度
"子视图的高宽和位置是由父视图决定的"这句话如何理解
内外边距
内外边距可用于所有视图,padding和margin的默认值是0;设置了margin之后就像在视图的周围有一道防护,阻止其他元素进入.
课程1C:课程实践
课程2A:制作一款交互性应用
课程3B:面向对象编程
intent
android框架的重点之一,调用其他应用.comment intents.
能实时识别用智能手机相机所拍摄的物品并提供与之相关的内容,都是通过利用强大的计算机视觉算法实现的
洋葱数学
SmartBar
android framwork和anfroid sdk
统一推送联盟
Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。
其他信息可先参考百度百科.
android的c++开发包叫做ndk,就是native开发包
Android上页面推荐使用rem单位?
ViewGroup中设置的属性是干嘛的
dimens文件
layout_padding
和margin
的区别,我怎么感觉两者差不多呢?
不同视图的id可以相同?
如何给xml中的属性注释
临时文件目录是/data/local/tmp
?
导入项目的几种方式
微信公众平台接口测试帐号申请
JuiceSSH
12 栏响应式栅格布局?
Jetpack
菜鸟教程for Android:
关于设计规范(排版,文字大小,颜色,布局等),可以参考google的:
某机构收集的android学习资料:
关于文字外观(待阅读):
不需要科学上网,修改DNS就可以解决:去查询dl.google.com
的ip,然后ping一个可用的,将其放到hosts文件中就可以了。
真机调试