1,Android UI体系
1) Android之MVC、MVP
对于小项目可以按如下分法(mvp选用);对于大项目可以按模块分,然后模块内再按如下分发。
分包(按功能分):
basal:基类;
surface(fragment、activity、broadcast、listener):界面类;
adapter:适配器类;
mvp(presenter、constract、view):mvp层类;
util:通用工具类;
widget:自定义View类;
entity:实体类;
Config.class
MyApplication
2)xml
字体一般是34px、30px、28px、26px、24px、22px
小细线1px dddddd 粗线10px f5f5f5 背景色f5f5f5、app的左右距离是20px
主题色
3)Window和WindowManager
4)图片
①Drawable
②Bitmap的加载和Cache
5)其他
事件通知实现的基本思想来源于观察者模式。(与Swing一样,都使用观察者模式)
6)控件
①View
②标题栏
7)动画
8)菜单
当每次Menu显示时,会调用方法onPrepareOptionsMenu,也可以在菜单每次被调用时,对菜单中的项重新生成,通过重载onPrepareOptionsMenu来实现,由于每次调用时都要重新生成,对于那些不经常变化的菜单,效率就会比较低。
调用Menu.addSubMenu()方法,为某个菜单项添加子菜单。
①选项菜单Options menus
一个Activity只能有一个选项菜单,在按下Menu键时,显示在屏幕下方。
重写 onCreateOptionsMenu 用以创建选项菜单 ;
重写 onOptionsItemSelected 用以响应选项菜单 。
②上下文菜单Context menus
为Activity中的任何一个视图注册一个上下文菜单,“长按”出现。
重写 onCreateContextMenu 用以创建上下文菜单;
重写 onContextItemSelected 用以响应上下文菜单 。
③弹出式菜单Popup menus
依赖于Activity中的某个一个视图。
9)Splash界面
①作用
展现产品的logo
初始化操作(创建数据库,读取配置文件)
连接服务器检查软件授权
连接服务器检查软件的更新
②实现
用handler延迟,在SplashActivity界面中写如下代码 ,并禁用返回键。
private final int SPLASH_DISPLAY_LENGHT = 3000;
……
handler = new Handler();
// 延迟SPLASH_DISPLAY_LENGHT时间然后跳转到MainActivity
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplashActivity.this,
MainActivity.class);
startActivity(intent);
SplashActivity.this.finish();
}
}, SPLASH_DISPLAY_LENGHT);
11)屏幕分辨率自适应
①组件大小:权重(layout_weight)、具体像素(dip)
②图片:drawable-hdpi、.9.png图片
③AndroidManifest.xml
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:anyDensity = "true"/>
android:anyDensity
值为true
,系统会依据屏幕密度,自动去找对应的文件夹。
如果drawable-hpdi中有高密度图片,其它两个文件夹中没有对应图片资源,那么系统会去加载drawable-hdpi中的资源。
2,四大组件+重要组件
1)四大组件-Activity
①Fragment相关
2)四大组件-Service
3)四大组件-Content Provider
4)四大组件-BroadcastReceiver(广播接收者)
5)重要组件-intent
3,Android JVM
1)存储方式(数据持久化)
数据持久化:将内存中的数据模型转化为存储模型。、
其他存储方式:
redis:一个开源使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。
sessionStorage:生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了。
①SQLite数据库
存储结构化数据。点击查看SQLite详情
②文件存储
分为内部存储和外部存储(SD卡)两种存储方式。
a.File.mkdirs和File.mkdir的区别
File.mkdirs在多层目录底下创建文件。
File.mkdir能在二层目录只能一层创建文件,仅能在已有目录下创建. 对于路径实际不存在的,调用File.mkdirs()方法。
b.onSaveInstanceState
onSaveInstanceState使用详解-之解决问题:android程序崩溃后,app异常
③SharedPreferences
共享参数,键值对形式存储。点击查看SharedPreferences详解
④网络存储
将数据存储到服务器上。
⑤ContentProvider存储
查看四大组件-Content Provider。
ContentProvider的目的是对外暴露数据供其他程序查询。
2)Android底层
①垃圾回收机制(GC)
②内存泄露OOM(OutOfMemory)
③JNI(Java Native Interface,java本地接口)编程
3)Android系统架构
4) 数字签名
5)DVM
每个 Android 应用程序都运行在单独的 Dalvik 虚拟机内(即每个 Android 应用程序对用一条 Dalvik 进程), Dalvik 专门针对同时高效地运行多个虚拟机进行优化,因此 Android 系统以方便的实现对应用程序进行隔离。
每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,每一个DVM都是在Linux 中的一个进程,所有Android应用线程对于一个Linux线程,DVM因此可以更多的依赖操作系统的线程调度和管理机制。
Android 运行时由两部分组成:
1)Android 核心库集
提供了 Java 语言核心库所能使用的绝大部分功能。
2)Dalvik 虚拟机
DVM负责运行 Android 应用程序。
4,进程和同步
1)IPC(跨进程通信,Inter-Process Communication)
①socket传输中,流的关闭
②android端通过socket接收到数据产生乱码
③socket ECONNRESET 异常
④socket长连接,造成数据粘包问题
⑤android网络连接—主线程连接错误
2)线程和异步任务机制
3)线程和线程池
4)守护进程的实现及进程拉活详解
5)消息机制Handler
6)资源池
Android中提供了资源池的对象有:
–Message
提供了消息池,有静态方法Obtain从消息池中取对象。
–AsynTask
AsynTask是线程池改造的,池里 默认提供(核数+1)个线程进行并发操作,最大支持(核数 * 2 + 1)个线程,超过后会丢弃其他任务。
–ThreadPool
Thread默认不提供资源池,除非使用线程池ThreadPool管理。
对于Looper,每个Looper创建时创建一个消息队列和线程对象,但不是资源池。
5,Android基本知识
1)项目结构
src
存放java源代码
gen
根目录。存放系统自动生成的配置文件,如R文件、类库、jar包.
R.java作用:
开发工具自动产生,存放各种资源id,方便找到对应资源。同时,未被R.java用到的资源,不会编译进软件。
assets
存放资源文件(网页、图片、音频)。
不会自动占用生成的apk文件大小,被应用的时候才生成。
assets目录中的文件就需要借助AssetManager去访问。
AssetManager a = getAssets() ;
//fileName为assets目录下需要访问的文件的名称
InputStream is = a.open(fileName) ;
//然后就可以通过输入流来读取fileName的内容了
bin
自动生成的编译后的文件。
libs
第三方jar包
res
图片、布局文件、菜单布局文件、values文件夹:字符串、数字、颜色、样式等。
AndroidManifest.xml:清单文件,配置应用相关信息:包名、权限、组件。
系统会为res目录下的所有资源生成相应的资源ID。
raw
在res目录下。
res/raw目录下的文件,有些文档说会编译为二进制,有些文档说不会。
Android不能直接打开res raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。
InputStream is = getResources().openRawResource(R.id.fileNameID) ;
//R.id.fileNameID为需要访问的文件对应的资源ID.接着我们就可以通过输入流来读取相应文件的内容了。
defalut.properties
存放项目环境信息。
asset文件夹和raw文件夹区别?
res/raw和assets的相同点:
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
1)res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即 R.raw.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2)res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
3)读取文件资源举例:
读取res/raw下的文件资源,通过以下方式获取输入流来进行:
InputStream is = getResources().openRawResource(R.raw.filename);
读取assets下的文件资源,通过以下方式获取输入流来进行写操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open("filename"); )
2)Android系统优缺点
五大不足:
①安全与隐私
②首先开卖Android手机的不是最大运营商
③运营商仍然能影响到Android手机
④同类机型用户减少:缺少统一机型的程序
⑤过分依赖开发商缺少标准配置:开发依赖第三方,缺少产品统一性。
优点:
①市场份额大
②应用程序发展迅速
③智能厂家助力
④手机价廉但性能不低
⑤机型多,硬件配置优
⑥系统开源:利于创新,开发者多,方便开发。
3)Android SDK-tools目录下的常用工具
①android
②apkbuilder
用于打包apk
③ddms(Dalvik Debug Monitor Service,Dalvik 调试监视器服务)
这个工具集成了Dalvik(为Android 平台定制的虚拟机(VM)),能够让你在模拟器或者设备上管理进程并协助调试。
DDMS是一个程序执行查看器,可以看见线程和堆栈等信息。
功能:
为测试设备截屏;
选择某个特定的进程来调试,产生跟踪数据,观察堆(heap)和线程信息;
杀死进程;
Logcat。Log信息分为5个级别:Log.v(VERBOSE)详细信息、Log.d(DEBUG)除错讯息、Log.i(INFO)通知讯息、Log.w(WARN)警告讯息、Log.e(ERROR)错误讯息
广播状态信息;
模拟电话呼叫;
接收SMS;
虚拟地理坐标等。
工作:
DDMS将搭建起IDE与测试终端(Emulator或者connected device)的链接,他们应用到测试终端的连接情况,当有新的测试终端连接后,DDMS将捕捉到终端的ID,并通过adb建立调试器,从而实现发送指令到测试终端的目的。
④draw9patch
Draw 9-patch工具允许你使用所见即所得(WYSIWYG)的编辑器轻松地创建NinePatch图形。它也可以预览经过拉伸的图像,高亮显示内容区域。
⑤emulator(Android模拟器)
AVD Manager(安卓虚拟设备管理器):
可以配置:屏幕分辨率(Skin)、缓存区大小(RAM)、SD卡支持(SD Card Support)、键盘支持。
不能 配置蓝牙支持。
⑥mksdcard
帮助你创建磁盘映像(disk image),你可以在模拟器环境下使用磁盘映像来模拟外部存储卡(例如SD 卡)。
⑦sqlite3
这个工具能够让你方便地访问SQLite 数据文件。这些数据文件是由Android 应用程序创建并使用的。
⑧aidl(Android Interface Description Language,Android接口描述语言)
可以让你生成进程间的接口的代码,诸如service可能使用的接口。
aidl的文件的内容类似java代码;创建一个Service(服务),在服务的onBind(Intent intent)方法中返回实现了aidl接口的对象;aidl对应的接口的方法前面不能加访问权限修饰符。
AIDL支持的数据类型有:
i>不需要import声明的简单Java编程语言类型:int boolean等。
ii>String,CharSequence不需要特殊声明
iii>List,Map和Parcelables类型
(这些类型内所包含的数据成员也只能是简单数据类型,String等其他支持类型。
⑨TraceView
程序性能分析器。
是 Android 平台特有的数据采集和分析工具,它主要用于分析 Android 中应用程序的 hotspot。TraceView 本身只是一个数据分析工具,而数据的采集则需要使用 Android SDK 中的 Debug 类或者利用 DDMS 工具。
4)platform-tools目录
常用工具有:
①aapt
②adb
③dx
④aidl
6,demo
检测android主屏,并把app从后台切换置前台
保持屏幕常亮
ping不同的网络并返回网络状态
断线重连机制
通过正则表达式解决数据传输过程中的堆包问题
px与dip转换
GPS开启
检测GPS是否开启,如果没有则跳到GPS界面供用户开启。
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
// 判断GPS是否正常启动
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
ToastUtil.showShort(context, "未开启位置服务,请开启GPS导航");
// 返回开启GPS导航设置界面
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, 0);
return;
}
7,应用
1)token登录
①定义
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
②作用
Token的目的是为了验证用户登录情况以及减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,这样增加了服务器负担。
③应用
i>用户首次登录成功之后, 服务器端就会生成一个 token 值,保存在数据库并返回给客户端.
ii>客户端拿到 token 值之后,使用sp进行保存。
iii>客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器.
iv>服务器接收到客户端的请求之后,取出token值与保存在本地(数据库)中的token值做对比
如果两个 token 值相同, 说明用户处于登录状态。
如果没有这个 token 值, 没有登录成功。
如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录。
2)登录验证
通过.requestFocus()获得焦点,提高用户体验
String Str_name = et_username.getText().toString().trim();
String Str_psw = et_password.getText().toString().trim();
if (null != Str_name && Str_name.equals("")) {
showCustomToast("用户名不能为空");
et_username.requestFocus();
} else if (null != Str_psw && Str_psw.equals("")) {
showCustomToast("密码不能为空");
et_password.requestFocus();
} else if (Str_psw.contains("卍")) {
showCustomToast("密码不能含有特殊字符");
et_password.requestFocus();
} else if (Str_psw.length() < 6) {
showCustomToast("密码不能少于6位");
et_password.requestFocus();
} else {
tryLogin(Str_name, Str_psw);
}
3)日志
8,问题解决
1)eclipse找不到设备,adb需要重启
写一个.bat文件,内容如下:
(注意:cd /d D:\android-sdks\platform-tools 请替换为自己的adb.exe路径)
@echo off
taskkill /F /IM adb.exe
echo Kill完成...
pause
echo 重启开始...
cd /d D:\android-sdks\platform-tools
adb devices
pause. & exit
2)其它
①android中使用Menu时可能需要重写的方法有:onCreateOptionMenu()和onOptionItemSelected().
②eclipse编辑器乱码解决
configChanges详解-之解决问题:手机切换字体后,app异常崩溃
Replace “…” with ellipsis character (…, &&;#8230;) ?
eclipse ‘Launching Hello’has encountered a problem