标签:目标 特定 not nal 组复制 模式切换 ble 1.0 示例
- Android系统架构: |
1.Linux内核层
Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动,音频驱动,照相机驱动,蓝牙驱动,Wi-Fi驱动,电源管理等。
2.系统运行底层
- 通过一些C/C++库来为Android系统提供了主要的特性支持
库名 | 功能 |
---|---|
SQLite库 | 提供数据库的支持 |
OpenGL/ES库 | 提供3D绘图支持 |
Webkit库 | 提供了浏览器内核的支持 |
- Android运行时库(主要提供一些核心库,允许开发者使用Java语言来编写Android应用。)
Dalvik虚拟机(5.0系统后改为ART运行环境) 使每个Android应用都能运行在独立进程当中,并拥有一个自己的Dalvik虚拟机实例。
3.应用框架层
主要提供了构建应用程序时可能用到的各种API,Android自带的核心应用就是使用这些API完成的,开发者也可以用这些API来构建自己的应用程序。
4.应用层
应用程序都是属于这一层,联系人,短信,游戏等都是。
总结:
- Android应用开发特色: |
1.四大组件
2.丰富的系统控件
3.SQLite数据库
4.强大的多媒体
5.地理位置定位
- 开发环境构建工具: |
1.JDK
2.Android SDK
3.Android Studio
- 分析Android程序: |
创建完毕以后,将项目结构模式切换成Project
1.整体目录结构分析
说明:除了APP目录外,其他目录都是自动生成的。APP目录的下的内容才是我们的工作重点。
2.APP目录结构分析
说明:程序的默认运行效果就是不写一行代码,直接部署到模拟器上的运行效果。
3.定义主活动
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
//这两句代码表示MainActivity是主活动,点击图标后首先运行此活动
</intent-filter>
</activity>
说明: 这段代码表示对MainActivity活动进行注册,没有在AndroidManifest.XML中注册的活动是不能使用的。
4.主活动分析
package com.example.zy.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
//活动被创建必须要调用下述的方法
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
说明:
1.我们之前说了应用程序中所有的可以看到的东西都是放到活动中的,所以首先必须要继承自活动。
2.主活动的继承关系:
3.super.onCreate(savedInstanceState)就是调用父类的onCreate构造函数,时用来创建活动的,savedInstanceState是保存当前Activity的状态信息。
5.HelloWorld来自哪?
其实在Android程序的设计讲究逻辑和视图分类,因此是不推荐在活动中直接编写界面的,更加通用的方法是在布局文件中编写界面,然后在活动中引入进来。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.zy.myapplication.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
说明: 我们看到其中有一个TextView,这是Android的一个控件,用于在布局中显示文字的。
6.详解res目录
说明:之所以有这么多的mipmap开头的文件夹,其实主要是为了让程序能够更好地兼容各种设备。
打开values目录下的strings.xml文件:
<resources>
<string name="app_name">My Application</string>
</resources>
这里定义了一个应用程序名的字符串,我们可以使用以下两种方式引用它:
7.详解build.gradle
在AS中,我们是通过Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于 XML的繁琐配置。
I.最外端的build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath ‘com.android.tools.build:gradle:2.1.0‘
}
}
allprojects {
repositories {
jcenter()
}
}
说明:
II.APP目录下的build.gradle
apply plugin: ‘com.android.application‘
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.example.zy.myapplication"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes { //用于指定生成安装文件的相关配置,一般有release和deubug两项。
release {
minifyEnabled false //是否对代码进行混淆
proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘ //代码的混淆规则
}
}
}
dependencies { //用于指定当前项目的所有依赖关系
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
//上着为本地依赖关系,将libs目录下*jar包添加到构建路径当中
testCompile ‘junit:junit:4.12‘
//声明测试用例库的
compile ‘com.android.support:appcompat-v7:25.2.0‘
//这是一个标准的远程依赖库格式,Gradle在构建项目时会检查是否有此库的缓存,如果没有则联网下载.添加依赖库声明:compile project(‘:helper‘),将helper依赖关系加入.
}
说明:
- 可见性: |
1.父类的私有成员也被子类继承,虽不能以成员名直接地访问这些私有成员,但可以间接地访问。
- 类间继承关系地设计: |
1: 什么是权限修饰符,他有什么作用,为什么需要他;
一个Java应用有很多类,但是有些类,并不希望被其他类使用。每个类中都有数据成员和方法成员,但是并不是每个数据和方法,都允许在其他类中调用。如何能做到访问控制呢?就需要使用访问权限修饰符。
1.权限修饰符就是用于控制被修饰变量、方法、类的可见范围.也就是其作用范围; |
2:java中权限修饰符包括4种:
1.公共类型 public ; 2.public可以修饰类,成员变量,构造方法,方法成员。 3.被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包, 4.是权限最大的一个修饰符 |
1.私有类型 private;
2.可以修饰成员变量,构造方法,成员方法,不能修饰类(此处指外部类,不考虑内部类)。 3.被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。 |
1.默认类型 default;
2.可用于修饰类,成员变量,构造方法,方法,都能够使用默认权限,即不写任何关键字。 3.默认权限即同包权限,同包权限的元素只能在定义它们的类中,以及同包的类中被调用。 |
1.保护类型 protect;
2.可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。 3.被protected修饰的成员,能在定义它们的类中,同包的类中被调用。 4.如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类。 |
图片:
3: 关于权限修饰符还要注意几个问题;
1.并不是每个修饰符都可以修饰类(指外部类),只有public和default可以。 2.所有修饰符都可以修饰数据成员,方法成员,构造方法。 3.为了代码安全起见,修饰符不要尽量使用权限大的,而是适用即可。比如,数据成员,如果没有特殊需要,尽可能用private。加强封装性; 4.修饰符修饰的是“被访问”的权限。 |
this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 this的用法在java中大体可以分为3种:
|
super super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。 super也有三种用法:
|
super和this的异同: super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参) this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名) 调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。 super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。 super()和this()均需放在构造方法内第一行。 尽管可以用this调用一个构造器,但却不能调用两个。 this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。 this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。 |
James Gosling在1995年2月发表了一篇名为”Java概览”的Java白皮书,文章解释了Java不支持多重继承的原因。
Java去除了一些C++中很少用、而且被经常误解而错用的功能,如操作符的重载(operator overloading)(尽管Java仍旧保留方法的重载),多重继承(multiple inheritance),以及广泛的自动强迫同型(extensive automatic coercions)。 |
Java: 一种简单的,面向对象的,分布式的,解释型的(译者注:Java既不是纯解释型也不是纯编译型的语言),健壮的,安全的,架构中立的,可移植的,高性能的,支持多线程的,动态语言。 |
为了强化简单这个特点,这就是我们去除多重继承的原因。下面来看个例子,多重继承的菱形继承问题。
tupian
有两个类B和C继承自A。假设B和C都继承了A的方法并且进行了覆盖,编写了自己的实现。假设D通过多重继承继承了B和C,那么D应该继承B和C的重载方法,那么它应该继承哪个的呢?是B的还是C的呢?
C++中经常会掉入这个陷阱,虽然它也提出了替代的方法来解决这个问题。我们在Java中就不会出现这个问题。就算两个接口拥有同样的方法,实现的类只会有一个方法,这个方法由实现的类编写。动态的加载类会让多重继承的实现变得困难。
第一题:In Java, arrays are
A .primitive data types
B .objects
C .interfaces
D .primitive data types if the type stored in the array is a primitive data type and objects if the type stored in the array is an object
E .Strings
分析:索引值必须大于等于0并且小于数组的元素个数。如果数组中有X个元素,则索引值是0~X-1.
分析:参数被定义为变量最初被声明为类型参数名称。这里,类型为int[],参数为a。
分析:第一次银行帐户;为firstentity银行保留内存空间,它本身是指向BankAccount[]对象的引用变量。第一次银行账户=新银行账户[1000];实例化BankAccount[]对象为1000个BankAccount对象。
分析:第一个声明声明a和b都是int数组。第二个声明声明c和d是ints,但对于d,一个int数组。a b和d都是int数组。
分析:这样使得两个数组是相同的,所以a和b所引用的数组是同一个,所以一个称为另一个的别名。
分析:在java命令之后,在命令行输入的任何内容都将被接受为命令行参数。如果是由空格分隔的几个单词,那么每个单词都作为一个单独的字符串数组元素存储。
分析:数组索引必须是int类型,或者可以扩展为int类型的值(因此,char、byte和short也是允许的)。
分析:数组的一个缺点是它的固定大小。一旦实例化,它的大小是固定的。ArrayList是一个使用数组的类,它会自动创建一个更大的数组,将旧数组复制到新数组中,这样ArrayList就可以根据需要更大。虽然这可以解决抛出异常的问题,但它确实会导致性能较差,因为每次增加ArrayList大小时,必须从一个数组复制到另一个数组。
分析:Java为可变长度参数列表提供了特殊的表示法。省略号(…)用于指定可变长度参数列表。
分析:对ArrayList的前部分进行插入或删除时,就会发生大量的元素复制,从而降低其效率。
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
概念很多,嘚仔细看,有很多细节,和前面的章节联系紧密。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 95/95 | 1/1 | 18/18 | |
第二周 | 515/620 | 1/2 | 22/40 | |
第三周 | 290/910 | 1/3 | 20/60 | |
第四周 | 1741/2651 | 1/4 | 30/84 | |
第五周 | 579/3230 | 1/5 | 20/104 | |
第六周 | 599/3829 | 1/6 | 18/122 | |
第七周 | 732/4561 | 1/6 | 24/146 |
计划学习时间:22小时
实际学习时间:24小时
改进情况:稍有点
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
20172327 2017-2018-2 《第一行代码Android》第一章学习总结
标签:目标 特定 not nal 组复制 模式切换 ble 1.0 示例
原文地址:https://www.cnblogs.com/mrf1209/p/9327394.html