【android学习】android知识点总结

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

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

猜你喜欢

转载自blog.csdn.net/sunshinetan/article/details/72599155