您的位置:首页 > 移动开发 > Android开发

【android学习】android知识点总结

2018-03-01 09:11 465 查看

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);


10)实践应用

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系统架构

Android系统架构采用了分层架构,从低层到高层(5层)分别是:Linux Kernel(Linux内核)、Hardware Abstraction Layer(硬件抽象层)、Libraries(系统运行库或者是c/c++ 核心库)、Application Framework(开发框架包 )、Applications(核心应用程序)。



(旧的版本是4层:应用程序程序层、应用框架层、系统库和android运行时和Linux内核)

①应用程序程序层

该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。

②应用框架层

该层是Android应用开发的基础,开发人员大部分情况是在和她打交道。应用程序框架层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。

③系统库和android运行时

系统库包括九个子系统,分别是图层管理、媒体库、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。Android运行时包括核心库和Dalvik虚拟机,前者既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比如android.os、android.NET、android.media等等。后者是一种基于寄存器的java虚拟机,Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。

④Linux内核

Android核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。

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

存放项目环境信息。

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)日志

android离线日志文件打印

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异常崩溃

eclipse创建app时多出appcompat_v7

android开发误删appcompat_v7

Replace “…” with ellipsis character (…, &&;#8230;) ?

eclipse ‘Launching Hello’has encountered a problem

9,语法

常用Manager

10,开源控件

1)EventBus

GitHub

②作用

EventBus就是publish/subscribe消息总线,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。

可以传递String、class

③三要素

Event:

事件。可以是任何的对象。

Subscriber:

事件订阅者,接收特定的事件。方法以onEvent**开头,一共有四个方法onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync。它们之间的区别在于在不同的线程。等会会有一一举例。

Publisher:

事件发布者,用于通知Subscriber有事件发生,可以在任何的地方发布事件。使用也是简单,只要调用post(Object)方法就可以了。

④区别

onEvent:

事件在哪个线程发布出来的,就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。

onEventMainThread:

事件无论是从哪个线程发布出来的,都会在UI线程中执行。

onEvnetBackground:

事件是在UI线程中发布出来的,那么就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么就直接在该子线程中执行。

onEventAsync:

使无论事件在哪个线程发布,都会创建新的子线程

⑤使用

i>传递字符串

EventBus.getDefault().register(this);//接收者
EventBus.getDefault().unregister(this);//接收者
@Subscribe//接收者
public void method(String state){
switch (state){
case LoginActivity .Tag:
finish();
break;
}
}
EventBus.getDefault().post(LoginActivity.Tag);//发送者


ii>传递类

public class MessageEvent {
...
}//传递类
EventBus.getDefault().post(messageEvent);//发送

@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent) {//接收方(记得写注册和取消注册)
...
}


2)ButterKnife

GitHub地址

②介绍

ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成。

具体用法查看GitHub。

3)CircleProgressDialog

用法见GitHub

4)SwitchButton

滑动开关,用法见GitHub

5)AndPermission

Android6.0以后需要加入权限的时候询问用户。用法见GitHub

6)OptionFrame

一款Android弹出框、对话框、Dialog、popuwindow。用法见GitHub

7)高德地图

获取定位

8)友盟

分享功能

注意:使用的时候需要申请key。

①友盟AppKey

②如果要进行微信/QQ分享,要微信QQ的APP ID。

9)banner

github

10)glide

Glide是一个开源的图片加载和缓存处理的第三方框架。github
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: