项目经历整理

This commit is contained in:
yinkanglong_lab
2021-04-06 23:30:37 +08:00
parent b845347c66
commit 30f583d779
54 changed files with 3246 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
Android studio中常见的使用技巧
1. 编辑器
折叠县、标记栏
alt+数字 启动工具窗口
window中可以修改restore layout
2. 导航工具栏
project工具栏能够选择不同的模式
structure工具栏查看xml和.java的文件结构
favorites收藏的文件、行、断点
TODO工具补充注释
Commander工具窗口
3.主菜单栏,实现大部分功能
4. 工具栏能够实现基本的文本编辑运行调试可以通过View|Toolbar菜单项的选中来隐藏工具栏
5. 导航栏,用来定位当前的位置。
6. 状态栏,在整个界面的最低端,主要包括消息去,光标位置,行分隔符区域,文本格式区域,文件访问标识符区域,如出现时级别按钮
7. 常用操作。
ctrl+a,ctrl+w,ctrl+z,ctrl+shift+z
ctrl+e查看最近的文件
ctrl+alt+方向箭头遍历导航操作。
ctrl+一般的字母实现cut、copy、paste扩展粘贴赋值路径赋值偏好。
8.上下文菜单
9. 获取帮助
10.使用键盘导航
alt+f1 selectin
ctrl+n class查找
ctrl+shift+n find file
ctrl+g find line
ctrl+alt+home related file
ctrl+shift+backspace last edit location
ctrl+h type hierarchy
ctrl+b declaration
11.查找和替换文本
ctrl+f
ctrl+shift+f
ctrl+r
ctrl+shift+r
第三章在Androidstudio中进行编程
1. helper中能够find action对Androidstudio中的界面和属性进行操作
ctrl++’折叠光标代码块
ctrl+-’展开光标代码块
ctrl+shift++’折叠所有代码块
ctrl+shift+-’站看所有代码块
ctrl+‘。’折叠展开代码块
2. 执行代码补全
方向箭头选择enter键使用
3. 代码注释
ctrl+/java行注释
ctrl+shift+/java筷箸史
4.使用代码生成工具
5.插入动态模板
6.移动代码
7.设计代码风格(这里都是些无关紧要的细枝末节,让我们来看其他的东西)
第四章代码重构
感觉也不是我现在应该看得东西
这本书怎么看都是给老鸟进阶用的,还是随便浏览一下,直接归还得了。
可恶git的学习时间可能又要拖一段了。另外如果有一天完成了当下所有的作业而且还有足够的心情时在去学习和使用这些新东西吧。

View File

@@ -0,0 +1,63 @@
# Android的HelloWorld级别的问题解决
--------------
## >附加知识补充
----
> 1. sdk manager管理Android开发环境和系统镜像的文件夹
2. avd manager管理Android虚拟设备的工具,我们自己创建的avd设备存放在.android的目录下面。
3. android device monitorAndroid的状态监视工具和控制台命令窗口
4. android debug bridgeadbAndroid的调试工具
----
>使用eclipse创建Android程序比Androidstudio困难n倍毕竟自己小白不懂一些原理所以导致helloworld小程序的各种难产。
## > Android创建过程中的版本问题
* 首先在高版本的Android sdk中提供了对低版本Android sdk的支持这种支持不是直接兼容低版本的东西而是通过支持库包来时线即Android Support Library package来保证高版本的sdk的向下兼容性也就是说让低版本的sdk能够运行高版本的功能。其中
V4 Support Library支持API4及更高版本的Android sdk
V7-----------------------7-----------------------
V9-----------------------9-----------------------
V13----------------------13----------------------
V17----------------------17----------------------
* 在libs的文件夹目录下会产生低版本兼容库Android-support-v4或者v7等这与你在创建工程时选择的最低兼容sdk版本有关。另外如果选择的编译版本较高时会产生一个单独的兼容文件夹并且会报错此错误网上有解决方法经测试没几个可行的
## >关于style.xml/AppTheme相关的问题
------
解决这个问题主要有三种方法,参考:
http://www.jianshu.com/p/6ad7864e005e
(给的原理说明十分清晰)
1. 将所有values下的styles.xml都改为同样的最基础版本的theme即baseTheme里的基本主题
2. 如果想使用最新的主题效果可以可以将AndroidManifest.xml里的minSdkVersion改成14及已经包含此主题的sdk
3. 如果想兼容更低版本并且支持新主题需要导入支持库即Android-support-v7-appcompat库下载完成后通过导入工程的方式将这个库导入到相应的文件当中。在libs目录下回有兼容库包。具体方法参考原网站
## >Android使用过程中图标的导入问题
------
android:icon="@drawable/bear"变量的值经常出错,在制定文件夹下面并没有对应的图标需要插入自己导入的图标然后修改这个变量的值。
## >关于Android启动模拟器失败的解决方法
--------
> Dx unsupported class file version 52.0
* 首先创建虚拟设备对应相应的sdk然后运行虚拟设备继续讲程序launch到虚拟设备当中其间出现这样的错误在其他网站上已经有比较详细的说明
这个问题主要的原因是依赖包的编译版本比主程序的编译版本高,导致主程序无法正常编译或运行,解决这个问题无非两招:
1. 提升主程序的编译器版本,用最新的编译器编译主程序,这样就可以兼容那个依赖包
2. 降低依赖包的编译版本。
具体方法参考:
http://blog.csdn.net/feijitouhaha/article/details/52141274

View File

@@ -0,0 +1,21 @@
# android总体知识总结
----
## Activity宏观的介绍
-----
* Activity是一个应用程序窗口本身不提供用户界面元素只提供UI组件摆放和依附的容器视图View在layout.xml中定义Activity.setContentView()方法将Activity于View建立关联。
* 布局管理器--导演
* Activity--舞台
* ViewUI控件--演员
* 生命周期的每个阶段都有自己的回调函数
* onCreate
* onStart
* onResume
* onRestrart
* onPause
* onStop
* onDestroy
*

View File

@@ -0,0 +1,40 @@
# android的学习目录和索引
## 第一章
## 第二章
## 第三章
## 第四章
## 第五章
## 第六章
## 第七章
## 第八章
## 第九章
## 第十章
## 第十一章
##第十三章

View File

@@ -0,0 +1,16 @@
# Service
## 与service相关的方法和类总结
* Service
* IBinder onBinder(intent intent)通过该对象IBinder与service进行通信

View File

@@ -0,0 +1 @@
asf

View File

@@ -0,0 +1,46 @@
# 第一章基础知识讲解
-----
## >Android系统简介
-----
* **android 分层**
1. 应用程序层
2. 应用程序框架层
3. 系统运行库
4. linux核心层。
* **设计规则**
1. 每个程序都运行在了自己的进程空间中,需要时启动,不需要时终止。
2. 每个程序都有自己的运行库ART各应用程序之间的代码是相互隔离的。
3. 每个程序被分配唯一的ID任何应用程序的代码与其他应用程序的代码是相互隔离的。
* **Android应用程序的四大组件**
1. activity活动用于与用户进行交互的可视化界面凡是在应用程序中看到的东西都是放在activity中。每一个activity子类集成父类Activity。
2. Service服务无需可视化界面需要在后台长期运行的应用程序背景音乐播放器和后台数据处理任务等继承自父类Service。
3. Broadcast Receiver广播接收器接受和处理广播消息的组件。没有影虎界面在相应其接收到的信息时可以启动一个activity继承自父类BroadcastReceiver。
4. Content Provider内容提供者可以将指定的一组数据让其他程序使用。数据可能存储在文件系统或者SQLlife中。继承自父类ContentProvider。
5. 补充Intent负责对应一次操作中的动作、动作涉及的数据、附加数据进行描述。Android根据此描述找到对应的组件将intent传递给调用的组件。
* **Android应用程序框架层**
1. 使用java语言编写。
2. 使用java native interface调用core lib层的本地方法
3. 实现了一系列服务活动管理器窗口管理器、内容提供器、视图系统、通告管理器、包管理器、电话管理器、资源管理器、位置管理器、xmpp服务。
* **系统运行库**
1. 系统C库 从BSD集成的标准C系统函数库
2. 媒体库基于OpenMax库支持多种音频视频图像文件
3. Serface Manager显示子系统管理提供了2D&3D图层的无缝融合
4. LibWebCore最新的web浏览器引擎。
5. SGL底层的2D图形引擎
6. 3Dlibraries基于OpenGL3D软件加速
7. FreeType文图和矢量图字体显示
8. SQLLite数据库引擎。
9. Dalvik虚拟机在程序执行时编译成dex的字节码后交给dalvik虚拟机执行
10. ART虚拟机Dalvik的替代品。在应用成许安装时吧程序代码转换成及其语言避让程序成为真正的本地应用。
- 采用了AOT预编译技术。函数调用去虚拟化调用接口和虚函数时需要寻找真正的函数浪费大量的时间。去虚拟化后可以迅速调用。消除异常检查。
- 更高效的垃圾回收机制GC。GC调用有三种情况GC_EXPLICIT应用程序通过system.gc主动调用GC_FOR_ALLOC内存分配不足时 GC_CONCURRENT给java层分配内存后计算一份陪的大小达到阈值时对象大小超过384KBGC_MALLOC(内存分配失败)GC_EXTERANL_ALLOC(外部内存分配失败)
* **Linux内核**
安全性、内存管理、进程管理、网络协议栈、驱动模型。

View File

@@ -0,0 +1,41 @@
# android的helloworld
---------
## >androidStudio的开发步骤
-----
1. 创建android项目和文件结构
2. 在XML布局文件中定义应用程序的用户界面
3. 在.java文件中编写业务的实现。
> android 的文件结构中只有三个有用:.java实现应用程序的业务res中的.xml实现工程的视图的资源文件manifest.xml实现相关资源的协调配置。
> 4大组件activityservicebroadcastreceivercontentProviderintent不同组件之间通讯的载体
## >android studio 中的文件结构
* src文件夹保存java文件
* res文件夹保存资源文件和xml文件
* bin文件夹存放生成的目标文件
* gen文件夹自动生成的R.java文件
## >相关文件的理解
-----
* R.java是一个资源统筹文件每个资源对应一个内部类的int值和field相当于为为每个其他的资源文件添加了一个变量或者说定义了一个相对于软件的全局变量。在.java文件中相当于添加了一个字段public static final int app_name = 00123031;在xml文件中的引用方法@string/app_name另外标识符不需要R资源文件的定义就可以直接使用@+id/ok
* value/string.xml,定义了全局的字符串常量。
* androidManifest.xml全局描述文件。统筹了很多东西。通过<manifest/>标签声明需要的权限,<activity/>声明被调用用的权限。
## &gt;antivity中包含的方法的总结
-----
getWindow()获得当前窗口的对话框
setContentView()设置当前activity的主要视图xml文件
setTheme()设置xml文件显示的主题风格
签名防止同名的包中的程序被覆盖。

View File

@@ -0,0 +1,16 @@
## 第二章界面编程Dialog
-----
# &gt;对话框
-----
* AlertDialog
1. 组成:包括图标区、标题区、内容区、按钮区
2. 使用步骤:定义对象->设定标题->设定图标->设定对话框的内容->设置按钮->创建对象
3. 相关方法setTitle();setCustomTitle();setIcon();setPositiveButton();setNegativeButton;setNeutralButton();setMessage();setItems();setSingelChoiceItems();setAdapter();setView()
> 遇到的问题:
> android:theme="@android:style/Theme.Material.Dialog.Alert在manifest.xml中修改视图的主题失败导致软件不能启动
> View root = this.getLayoutInflater().inflate(R.layout.popup,null);这句话的具体意图没有搞明白,似乎是把某个视图声明为子视图。

View File

@@ -0,0 +1,15 @@
# 第二章界面编程view组件的应用
----
# &gt;view组件
----
> 对于属性和相关方法的理解其中每一个空间都是一个对象每个对象都有指定的属性和方法。在xml可以定义一个对象并通过xml的语法格式对创建的对象的属性进行初始化同样也可以在java中使用public方法对相关的对象进行属性的设置。
> 另外可以在xml使用对象的布局也可以通过java对布局进行设定。
* 属性和相关方法
> 事实证明刚才犯了一个及其傻逼的错误在对android极其不了解的情况下认为同一个页面可以使用多个布局极其傻逼浪费了自己大量时间不过也让自己静下心来认真的读了一点点代码。

View File

@@ -0,0 +1,119 @@
# Android第三章
----
## &gt;事件处理的概述
----
* 两种事件处理机制
1. 基于监听的事件处理
2. 基于回调的事件处理
## &gt;基于监听的事件处理机制
----
* 涉及到的三类对象
1. Event Source事件源指各个组件。
2. Event 界面组件上发生的特定的事情,。
3. Event Listener监听事件源发生的事情。并对各种事情作出相应的响应。
4. Event Handler事件处理器当事件监听器捕获事件后由响应的事件处理器识别特定的事件并做出响应的动作。
* 事件监听机制的工作流程
普通组件(事件源对象) 发生很多事件,生成多种事件对象 被同一个监听器对象捕获 监听器通过不同的事件处理器处理这个事件。
> 每个组件可以根据不同的事件类别指定多个监听器,每一个监听器可以监听多个事件源。
## &gt;实现事件监听器的方法
----
1. 内部类作为时间的监听器
使用内部类作为事件监听器能够在这个类内复用该监听器。该监听器类能够自由访问外部类的所有界面组件
2. 外部类作为时间监听器
事件监听器通常属于特定的GUI界面定义成外部类不利于提高程序的内聚性。外部类形式的时间监听器不能够自由访问GUI界面的类中的组件。同时也适用于监听器于GUI界面没有任何耦合情况。
> 监听器还是主要来写显示逻辑,具体的业务逻辑放到外部的其他函数或者类中进行处理。
3. Activity类本身作为事件监听器
不推荐activity类本身用来界面初始化工作包含事件监听器容易造成程序的逻辑结构混乱。
4. 匿名类作为时间监听器类
大部分时候事件监听器类的代码没有什么复用价值,所以只要使用匿名类来实现事件监听器想要达到的页面逻辑就好。
> android可以直接在界面布局中制定标签绑定事件的处理方式。
> androidonClick="clickHandler"
## &gt;基于回调的事件处理方法
----
* 回调机制
事件的处理直接绑定到与组件相关的时间处理函数上,而非通过监听器的监听和事件处理器的匹配处理。有点像事件监听器和事件源融合在一起,不需要单独的时间监听器类,事件源本身能够监听自身发生的各种事件。
* 基于回调的事件传播
当返回为true时表明该方法已经能够处理发生的事件事件不会向外传播给外层的时间监听器。当返回为false时如果有外围的监听器处理同一个事件则事件会向外传播同时被其他监听器坚挺到。如果存在各种监听器其监听顺序为绑定的事件监听器-->基于回调的内部事件监听器-->基于回调的外部事件监听器。
## &gt;相应系统设置的事件
----
* 用来获取系统的配置
```Configuration cfg = getResources().getConfiguration();
```
* onConfigurationChanged能够监听相关的配置改变的事件。
## &gt;Handler消息传递机制
---
* 工作原理
android第一次启动主线程负责activityUI界面的线程而且只允许UI线程对主界面进行修改其他新启动的线程无法对主界面进行直接修改需要使用Handler进行消息传递。
* Handler简介
1. 在新启动的线程中发送消息
2. 在主线程中获取和处理消息
>好像是原来的事件处理机制变成了消息处理机制,通过监听消息,处理消息完成一系列动作,同事件处理一样。
* Handler涉及的方法
1. HandlerMessage()
2. hasMessage()
3. hasMessages()
4. obtainMessage()
5. sendEmptyMessage()
6. sendEmptyMessageDelayed()
7. sendMessage()
8. sendMessageDelayed()
* Handler、Loop、MessageQueue的工作原理
1. Message是Handler接受和处理的对象
2. Looper每个线程只能有一个Looperloop方法负责读取MessageQueue中的消息
3. MessageQueen消息队列采用了先进先出的方式管理队列。
```
private Looper()
{
mQueue = new MessageQueue();
mRun = true;
mThread = Thread.currentThread();
}
```
* Looper类的使用方法
1. 调用Looper的prepare方法创建Looper对象生成对应的MessageQueue来管理事件
2. 创建Handler子类用于发送本线程的消息。重写HandlerMessage方法负责处理来自其他线程的消息。
3. 调用Looper的loop方法启动Looper类
>UI线程一般专门用来相应用户的界面操作而其他的逻辑运算和处理都交给其他线程处理主要目的是防止UI线程被阻塞而让用户以为界面卡顿。
>此时如果UI线程与其他线程的交互方式就是Handler消息传递机制同事件监听机制的逻辑十分相似。
## &gt;异步任务
----
* 解决新线程不能更新UI主界面的问题的方法
* 使用Handler消息处理机制
* Activity.runOnUiThread(Runnable)
* View.post(Runnable)
* View.postDelayed(Runnable,long)
* 异步处理机制
* AsyncTask<Params,Progress,Result>异步类
1. 创建AsyncTask的子类并制定三个参数的类型。
2. 根据需要实现下列方法
* dolnBackground()后台线程即将执行的任务通过调用publishProgress()更新任务的执行进度
* onProgressUpdate()调用更新任务进度的方法后,会触发这个方法
* onPreExecute()方法,执行后台操作前被调用,完成初始化工作
* onPostExcute()后台任务执行完成后,调用这个方法
3. 调用AsyncTask子类的execute方法开始执行好事任务。

View File

@@ -0,0 +1,102 @@
4# 第四章Activity和Fragment2
----
## &gt;Activity的回调机制
----
* **回调机制的解释**
通用程序框架在完成整个应用个通用功能和流程时在特定点上需要相应的业务逻辑实现。java swing中的init()方法java Thread中的run方法都是一种回调机制
* **回调机制的存在形式**
1. 以接口的形式存在
2. 以抽象方法的形式存在通过oncreate、onActivityResult()函数能够直接创建一个Activity例如当有一个Activity被调用时生成相应的实例时就会通过onCreate方法创建一个Activity。
## &gt;Activity的生命周期
-----
* 四个状态
1. 运行状态当前Activity位于前台用户可见可以获得焦点。
2. 暂停状态其他Activity位于前台该activity依然可见但不能获得焦点
3. 停止状态该activity不可见失去焦点
4. 销毁状态activity结束。
* 生命周期示例图
![Activity的生命周期](http://img.my.csdn.net/uploads/201109/1/0_1314838777He6C.gif)
* Activity的四种加载模式
1. standard:标准模式
每次启动Activityandroid都会启动一个新的实例并通过Activity添加到当前的task栈顶就相当于同一个类会有多个对象同时在运行。
2. sigleTop:Task栈顶单例模式
与standard模式基本相同但是当要启动的类本身就位于栈顶事那么将不会重新创建Activity实例而是复用之前的Activity。
3. sigleTask:Task内单例模式
在同一个task中只允许有一种实例。不存在创建存在移动到栈顶显示。
4. sigleInstace:全局单利模式
无论从哪个任务中启动Activity都会只创建一个单一的实例。
> android 采用task栈对Activity进行管理先启动的放在 task栈底后启动的Activity被放在了task栈顶。
## &gt;Fragment详解
-----
* **Fragment的简介**
Fragment代表了Activity的子模块因此可以吧Fragment理解成Activity片段。Fragment拥有自己的生命周期能够接受自己的输入事件。
* Fragment总作为Activity的界面组成部分。Fragment可调用getActivity()方法返回ActivityActivity可以使用FragmentManager来管理相应的Fragment
* Fragment的add(),remove(),replace()方法可以动态地添加、删除或者替换Fragment。
* 一个Activity可以痛死组合多个Fragment一个Fragment 也可以被多个Activity复用。
* Fragment可以响应自己的输入输出事件有自己的生命周期。但是收到Activity的控制。
>Fragment主要是为了简化大屏手机的UI的设计。
* **创建Fragment**
onCreate()系统创建Fragment回调的方法
onCreateView()当Fragment绘制界面时回调这个方法
onPause()用户离开Fragment后回调的方法
## &gt;Fragment与Activity通信
----
* 在布局文件中使用<Fragment.../>元素添加Fragment
```
<Fragment
android:name="org.BookListFragment" //指定Fragment的实现类
Android:id="@+id/book_list"
Android:layout_height="match_parent"
android:layout_weight="1"/>
```
* 在java代码中通过FragmentManager对象实现。getFragmentManager()返回FragmentManagerbeginTransaction()启动返回FragmentTransaction对象。
## &gt;Fragment管理与Fragment事物
----
* FragmentManager可以完成的功能
* FragmentManager.findFragmentById()/...ByTag()获取指定的Fragment
* popBackStack()将Fragment从后台栈中弹出
* 调用addOnBackStackChangeListener()注册监听器
* add()
* remove()
* commit()
* replace()
## &gt;Fragment 的生命周期
----
* 四种不同的状态
* 运行状态,fragment位于前台获取焦点
* 暂停状态,activity位于前台Fragment可见
* 停止状态Fragment不可见失去焦点
* 销毁状态fragment被删除。
* 生命周期的控制函数。
> 以下的函数都是回调函数,在不同的时间被触发调用
* onAttach()当Fragment被添加到Activity中时
* onCreate()创建Fragment时
* onActivityCreated()当所在Fragment所在的Activity被启动时
* onCreateView()每次创建绘制该Fragment的View组件时
* onStart()启动Fragment时
* onResume()恢复Fragment时
* onPause()暂停Fragment时
* onStop()停止Fragment时
* onDestroyView()销毁Fragment包含的组件时
* onDestroy()销毁Fragment时
* onDetach()将该Fragment从Activity中删除时

View File

@@ -0,0 +1,210 @@
# 第四章Activity与Fragment的应用
----
## &gt;建立配置和使用Activity
----
* activity能够提供许多不同的操作页面它们做成Activity栈当前活动的应用位于栈顶。
* **LauncherActivity&&ArrayAdapter**
每一个列表项对应一个intent用于保存启动不同的activity的相关信息。
intentForPostion提供了位置和不同activity对应的信息将列表项链接到制定的intent。
* **ExpandableListActivity&&ExpandableListAdapter**
设置界面显示过程中,使用了适配器的相关函数,其中复写的函数能够自动调用生成相应的界面。
* getChild()获得子字表的内容
* getChildID()获得子表的id
* getChildrenCount()获得子表的项目数量
* TextView()获得每个子表的textView配置
* getChildView()获得每个子表的textView内容
* getGroup()获得主表
* getGroupCount()获得主表的数量
* getGroupId()获得主表的id
* getGroupView()决定主表的外观
* isChildSelectable()返回被选中的子表像
* hasStableIds()返回id
当在ExpandableListActivity中定义Adapter时这些函数必须都被复写保证能够生成一个新的列表就相当于XML对应的配置属性一样这样才能完整的显示整个表格。
* **PreferenceActivity&&PreferenceFragment**
1. 实现了参数设置界面让Fragment集成了PreferenceFragment
2. 在onCreate中调用addPreferencFromResource()方法,加载制定的界面布局文件。
* **在manifest.xml中配置多个Activity资源**
2. 配置多个Activity
```
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
```
## &gt;启动和关闭Activity
----
* **启动activity的两种方法**
* context.startActivity(intent)
* context.startActivity(intent,int)
* **关闭Activity的两种方法**
* context.finish()
* context.finishActivity(int)
* **代码示例**
```
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
```
## &gt;使用Bundle向指定的activity传递数据
----
* **intent携带额外数据的方法**
* putExtras(Bundle)
* getExtras()
* putExtra()
* getXxxExtra()
* putXXX(String,XXX)
* putSeriaLizable(String,Srializagle)
* getXXX(String)
* getSerializable(String,Serializable)
* **使用bundle和intent机制向指定的activity传递数据的方法**
* 定义方法向介质添加批数据并且将介质传递给目标activity
```
Person p = new Person(name.getText(),toString(),passwd.getText().toString(),gender);
Bundle data = new Bundle();
data.putSerializable("person),p);
Intent intent = new Intent(MainActivity.this,ResultActivity.class);
intent.putExtras(data);
startActivity(intent);
```
* 使用方法,从传递过来的intent中提取数据
```
Intent intent = getIntent();
Person p = (Person) intent.getSerializableExtra("person");
```
## &gt;启动Activity并且获取返回结果
* 当前的Activity启动另一个Activity获取它的结果并且返回到当前的Activity。
* **实现方法**
重写onActivityResult(int requestCode,int resultCode,intent intent)方法相当于一种回调方法当被启动的Activity生命周期结束并且返回结果时该方法将会被触发。
* **实现过程**
1. 用特殊函数启动另外的activity
```
Intent intent = new Intent(MainActivity.this,ResultActivity.class);
intent.putExtras(data);
startActivityForResult(intent,0);
```
2. 当activity结束时触发onActivity函数需要重写它。
3. 在另外的activity中仍旧需要bundle和intent进行配合传递数据
>对类的补充:
### Intent类交互介质
* **Intent类作用**
每个应用程序都有若干个Activity组成每一个Activity都是一个应用程序与用户进行交互的窗口呈现不同的交互界面。因为每一个Acticity的任务不一样所以经常互在各个Activity之间进行跳转在Android中这个动作是靠Intent来完成的。你通过startActivity()方法发送一个Intent给系统系统会根据这个Intent帮助你找到对应的Activity即使这个Activity在其他的应用中也可以用这种方法启动它。
* **Intent的定义**
Intent是Android系统用来抽象描述要执行的一个操作也可以在不同组件之间进行沟通和消息传递。
Intent意图可以是明确的指定组件的名称这样你可以精确的启动某个系统组件比如启动一个Activity。它也可以是模糊的没有指定组件名称只要是能够匹配到这个Intent的应用都可以接收到比如发送一个拍照Intent所有的拍照应用都会响应。
* **Intent有以下几个属性**
动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中最常用的是Action属性和Data属性。
###Bundle类(批数据,是一个键值对)
* **Bundle类的作用**
Bundle主要用于传递数据它保存的数据是以key-value(键值对)的形式存在的。我们经常使用Bundle在Activity之间传递数据传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组也可以是对象或对象数组。当Bundle传递的是对象或对象数组时必须实现Serializable 或Parcelable接口。下面分别介绍Activity之间如何传递基本类型、传递对象。
* **Bundle的定义和使用**
* 新建一个bundle类
view plain copy
Bundle mBundle = new Bundle();
* bundle类中加入数据key -value的形式另一个activity里面取数据的时候就要用到key找出对应的value
view plain copy
mBundle.putString("Data", "data from TestBundle");
* 新建一个intent对象并将该bundle加入这个intent对象
view plain copy
Intent intent = new Intent();
intent.setClass(TestBundle.this, Target.class);
intent.putExtras(mBundle);
* Bundle提供了各种常用类型的putxxx()/getxxx()方法,用于读写基本类型的数据。
## Context类的主体上下文
----
* **Context类的定义**
Interface to global information about an application environment. This is an abstract class whose implementationis provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc
* **Context使用场景**
1. 它描述的是一个应用程序环境的信息,即上下文。
2. 该类是一个抽象(abstract class)类Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类)。
3. 通过它我们可以获取应用程序的资源和类也包括一些应用级别操作例如启动一个Activity发送广播接受Intent信息
* **Context类图集成关系**
![context类图继承关系](http://hi.csdn.net/attachment/201203/1/0_1330607569Vj4c.gif)
* **Context相关的方法**
* getSystemService(String)获得系统级服务
* startActivity(Intent)启动一个Activity
* startService(Intent)启动一个service
* getSharedPreferences(String, int)
* **Context什自己的理解**
Context类相当于一个上下文环境能够很好的统筹一个Activity、service或者app的资源和调度方式他是负责指挥这些资源的类的接口他能启动关闭一个app等。
### Serializable类
----
> 序列化的内容补充
> 当两个进程在进行远程通信时彼此可以发送各种类型的数据。无论是何种类型的数据都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列才能在网络上传送接收方则需要把字节序列再恢复为Java对象。 把Java对象转换为字节序列的过程称为对象的序列化把字节序列恢复为Java对象的过程称为对象的反序列化。
* **Serializable接口的定义**
为了保存在内存中的各种对象的状态也就是实例变量不是方法并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states但是Java给你提供一种应该比你自己好的保存对象状态的机制那就是序列化。
* **使用情况**
* 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
* 当你想用套接字在网络上传送对象的时候;
* 当你想通过RMI传输对象的时候
* **Parcelable和Serializable的区别**
内存间数据传输时推荐使用Parcelable,activity间传输数据使用Parcelable是Android特有功能效率比实现Serializable接口高效可用于Intent数据传递也可以用于进程间通信IPC
保存到本地或者网络传输时推荐使用Serializable
### Parcelable类
* **Parcelable类的作用**
想要在两个activity之间传递对象那么这个对象必须序列化Android中序列化一个对象有两种方式一种是实现Serializable接口这个非常简单只需要声明一下就可以了不痛不痒。但是android中还有一种特有的序列化方法那就是实现Parcelable接口使用这种方式来序列化的效率要高于实现Serializable接口。不过Serializable接口实在是太方便了因此在某些情况下实现这个接口还是非常不错的选择。
* **Parcelable类的使用情况**
* 永久性保存对象,保存对象的字节序列到本地文件中;
* 通过序列化对象在网络中传递对象;
* 通过序列化在进程间传递对象。
* **Parcelable接口定义**
```
public interface Parcelable
{
//内容描述接口,基本不用管
public int describeContents();
//写入接口函数,打包
public void writeToParcel(Parcel dest, int flags);
//读取接口目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的所以需要用到模板的方式继承类名通过模板参数传入
//为了能够实现模板参数的传入这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例
public interface Creator<T>
{
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
}
```
* **实现序列化的步骤**
1. implements Parcelable
2. 重写writeToParcel方法将你的对象序列化为一个Parcel对象将类的数据写入外部提供的Parcel中打包需要传递的数据到Parcel容器保存以便从 Parcel容器获取数据
3. 重写describeContents方法内容接口描述默认返回0就可以
4. 实例化静态内部对象CREATOR实现接口Parcelable.Creator

View File

@@ -0,0 +1,119 @@
# android第五章Intent和IntentFilter的进行通信
-----
## &gt;intent对象的描述
----
* intent的理解
intent用来表示自己的意图需要启动哪个Activity。两个Activity可以吧需要交换的数据封装成Bundle对象然后使用Intent来携带Bundle对象这样就实现了两个Activity对象之间的数据交换
* 组件的启动方法
1. Activity
* startActivity(intent)
* startActivity(intent,int)
2. Service
* StartService(Intent)
* bindService(inten,seviceConnection,int)
3. BroadcastReceiver
* sendBroadcast(intent)
* sendBroadcast(intetn,String)
* sendOrderedBroadcast(intent,String,BraodcastReceiver,Handler,int,String,Bundle)
* sendOrderedBroadcast(intet,String)
* sendStickyBroadcast(intent)
* sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,initialCode,String,Bundle)
* 包含的属性
Component,Action,Category,Data,Type,Extra,Flag
## &gt;intent的属性及intent-filter配置
----
* Component属性
* intent设定component属性的方法
setClass(Context packageContext,Class<?> cls)
setClassName(Context packageContext,String className)
setClassName(String packageName,String className)
分别通过应用环境接口Context类component类和字符串的方式实现了指定启动对象的方法
* 启动Activity的中组件的具体方法
> MainActivity.this表示自身在内部使用外部类的时候这样表示。
```
ComponentName comp = new ComponentName(MainActivity.this,secondActivity.class
Intent intent = new Intent();
intent.setComponent(comp)
startActivity(intent)
```
* Action属性的配置
是一个字符串制定Intent要去完成的一个抽象的动作。Action的值可能是intent.ACTION_VIEW具体查看什么取决于<intent-filter/>
可以通过setAction方法这只Action属性
```
Intent intetn = new Intent();
intetn.setAction(MainActivity.CRAZYIT_ACTION);
startActivity(intent)
```
* Category属性的配置
可以通过add
是一个字符串为Action增加额外的附加信息。可以指定多个Category要求
* intent-filter的配置这是被启动的Activity的配置文件配置的事目标activity的intent属性这个是activity的唯一标识。
> 开始有点理解这些东西了可能就是一个用来交互的实体类对于每一个对象的唯一身份标识只需要创建一个这个实体就能通过相同的方式启动类并且通过Bundle传递相应的参数。
```
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
```
* 指定Action、Category调用系统的Activity
1. ACTION_MAIN
2. ACTION_VIEW
3. ACTON_ATTACH_DATA
4. ACTION_ATTACH_DATA
5. ACTION_EDIT。。。。。。。
6. CATAGORY_DEFAULT
7. CATEGORY_BROWSABLE
8. CATEGORY_TAB
* 在intent-filter中设置用户访问手机的权限
<user-permission android:name"android.permission.READ_CONTACTS"/>设置按钮,系统返回桌面
* Datatype属性的配置
向action提供操作的数据data属性可以接受一个URI对象scheme/hostport/path
content://com.android.contacts/contacts/1
tel:123
Type属性用来指定Data所对应的URI的MIME类型。
> Toast.makeText(this.intent.toString(),Toast.LENGTH_LONG).show()相当于弹窗程序,可以用来检测数据的值。
--在androidManifest.xml中实现data和type属性的配置方法
<data andriod:mimeType=""
android:scheme=""
android:host=""
android:port=""
android:path=""
android:pathPrefix=""
android:pathPattern=""/>
其中data元素匹配启动的方式是不完全匹配只要已经显示定义的值相同就能启动相应的activity。其中如果帮同事这只了Action和Data属性则能够同时通过两者启动Activity。
当启动了多个Activity时系统会显示打开这个请求的应用选择界面。也就是说平时会看到的选择某个应用打开这个文档就是通过这种方式实现的通过指定Data和Type属性来定位不同的应用。
> 通过Action和data属性的组合应用可以达到和系统交互信息的功能就是简单的调用系统固有的组件启动系统中本身存在的Activity
* Extra属性
用来在多个Action之间进行数据交互Extra是一个Bundle对象类似于C++中的map类
* Flag属性
为intent添加一些额外的控制标志通过addFlags()方法实现。
* FLAG_ACTIVITY_BROUGHT_TO_FRONT不会被杀死的Activity启动。
* FLAG_ACTIVITY_CLEAR_TOP弑父线程
* FLAG_ACTIVITY_NEW_TASK创建一个新的Ativity
* FLAG_ACTIVITY_NO_ANIMATION不使用过度动画
* FLAG_ACTIVITY_NO_HISTORY将被启动线程弹出工作栈
* FLAG_ACTIVITY_REORDER_TO_FRONT带到前台
* FLAG_ACTIVITY_SINGLE_TOP只会启动一个这样的activity

View File

@@ -0,0 +1,185 @@
# android应用资源(一)
-----
## &gt;应用资源概述
----
* 访问方式分类
1. 无法通过R资源清单类访问的原生资源保存在assets目录下
2. 可通过R资源清单访问的资源保存在res目录下
* 源代码按照物理存储形式分类
1. 界面布局文件
2. java资源文件
3. 资源文件android应用资源
* 资源的类型和存储方式
1. /res/animator/ 定义属性动画
2. /res/anim/ 定义补间动画
3. /res/color/ 定义颜色列表
4. /res/draWble/ 存放各种位图
5. /res/layout/ 存放布局界面
6. /res/menu/ 存放菜单资源
7. /res/raw/ 存放原生资源(音乐视频)
8. /res/value/ 存放简单值,字符串值、整型值、颜色值、数组等
9. /res/xml/ 原生的XML内容
* 使用资源
1. 在java文件中访问Pacage_name.R.resource_type.resource_name;
> 在这里使用的是资源清单,而不是实际资源,所储存到的东西不过是指向资源的一个整型数组。
2. getResources().getText(R.String.main_title)通过引用返回实际资源,用来建立资源副本
Drawable logo = res.getDrawavle(R.drawable.logo);
3. 在XML文件中访问@pacage_name:resource_type/resource_name
## &gt;字符串、颜色、尺寸资源
* 颜色值的定义#ARGB都是十六进制书
`<String name="CSD">这是一个字符串</String>`
`<color name="c1">#FOO</color>`
`<dimen name="spacing">8dp</dimen>`
`<bool name="is_male"> true </bool>`
* 字符串颜色尺寸资源的使用
```
<TextView
android:text="@string/app_name"
android:textsize="@dimen/title_font"
/>
<GridView
android:horizontalSpacing=dimen/spacing
/GridView>
```
* 在java代码中访问如下
```
R.color.c1
R.string.c1
R.dimen.cell_width
R.bool.bool_name
```
## &gt;数组资源
----
* 定义普通数组
```
<array name="plain_arr">
<item>@color/c1</item>
<item>@color/c2</itme>
</array>
```
* 定义字符串数组
```
<string-array name="plain_arr">
<item>@string/c1</item>
<item>@string/c2</itme>
</string-array>
```
* 定义整型数组
## &gt;使用Drawable资源
----
* 使用方式
```
@package_name:drawable/file_name
package_name.R.drawable.file_name
```
* StateListDrawable资源
能够根据目标组件的状态切换不同的分辨率图片。
支持的属性
android:stata_active
android:state_checkable
android:state_cheked
android:state_enable
android:state_first
android:state_focused
android:state_last... ...
* 具体使用说明
1. 在res\drawnable\my_image.xml中建立如下内容。本质上是在原来直接显示图片的基础上进行一次封装是的显示的图片具有动态变化的效果。
```
<sector xmlns:android="http:\\">
<item android:state_focused="true"
android:color="#f44"/>
<item android:state_focused="false"
android:color="#ccf"/>
```
## &gt;使用LayerDrawable资源
----
* 能够支持的属性
anroid:drawble制定图片对象
android:id指定对象的id
android:buttonm tom left button指定显示的位置。
* 使用的语法格式
<layer-list xmlns:android="http://"
<item android:id="@android:id/background"
android:drawable="@drawble/grow"/>
</layer-list>
* 内涵解释:
与StateListDrawable相似包含以个Drawable数组在不同的情况下调用不同的图片。
## &gt;使用ShapeDrawable资源
----
* 作用:
用来定义一个基本的图形(矩形、线条、圆形)
* 使用:(下一级标签)
<corners />定义了四个角的弧度
<gradient /> 定义了渐变色填充
<padding />定义了几何形状内边距
<size /> 定义几何形状的大小
<solid /> 定义使用单种颜色填充
<stroke /> 定义为集合形状绘制边框
## &gt;ClipDrawable资源
----
* 作用
从其他位图上截取一个图片片段
* 使用:(这个标签的属性)
android:drawable指定截取的资源
android:clipOrientation指定截取的方向
android:gravity指定截取时的对其方式
## &gt;AnimationDrable资源
----
* 作用:
代表一个动画,相当于逐帧动画,也可以通过平移、变换计算出来的补间动画。
<alpha />:设置透明度
<scale />:图片进行缩放变换
<translate />:图片进行位移变换
<rotate />:图片进行旋转
android:interpolator属性指定变化速度linear_interpolator/accelerate_interploator/decelerate_interpolator:匀速变化/加速变化/减速变化。
* 使用方法:
* 在XML文件中访问
@package_name:anim/file_name
* 在java代码中访问
package.R.anim.file_name
## &gt;属性动画资源
----
* 子类
AnimatorSet、ValueAnimator、ObjectAnimator、TimeAnimator
* 定义属性动画的根元素
* ```<set> </set>```
* ```<objectAnimator> </objectAnimator>```
* ```<animator> </animator>```

View File

@@ -0,0 +1,154 @@
# android应用资源(二)
-----
## &gt;使用原始XML资源
----
* 文件路径:
在/res/xml/路径下创建xml内容。
* 访问方式:
* java中package_name.R.xml.file_name
* @package_name:xml/file_name
* 获得实际的XML文件的方法
* XmlResourceParser getXml(int id),使用XMLPullParser来解析该XML文档该方法返回一个解析器对象XMLResourceParser是XmlPullParser的子类
* InputStream openRawResource(int id)获取xml文档对应的输入流。
* 使用XML文件
XmlResourceParser xrp = getResources().getXml(R.xml.books)
xrp.getName()获取标签名
xrp.getAttributedValue(null,"price");根据属性名获取属性值
xrp.getAttributeVale(1);根据属性的索引来获取属性的值
xrp.nextText()获取文本内容
xrp.next()下一个事件
## &gt;使用布局文件
----
> 参照第二章内容
## &gt;使用菜单资源
----
> 参照第二章内容
## &gt;样式和主题
----
> 感觉样式和主题就有点像html中css的作用负责通过xml定义一系列完整的格式而普通的java代码就像网页前端中js脚本负责完成前端的简单页面逻辑普通的xml代码就像html代码负责整体的布局。
* 样式的含义相当于多个格式的集合其他UI组件通过style属性来指定样式。
* 样式的定义:
* name:指定样式的名称
* parent:指定继承的父样式,获得父样式中的所有格式,同时可以覆盖父样式
```
<resources>
<style name="style1">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#00d</item>
</style>
</resources>
```
* 样式的使用style = "@package_name:style/file_name"
* 主题资源不能作用于单个View组件主体应该对整个应用中所有的Activity起作用或对指定的Activity起作用。主要是定义窗口外观的格式。
* 主题资源的定义方法
```
<style name="CrazyTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowFrame">@drawable/star</item>
</style>
```
* 主题资源的使用方法:
* java:setTheme(R.style.CrazyTheme);指定单一的Activity应用主题
* manifest.xml<application andorid:theme="@style/CrazyitTheme"></application>;对整个工程使用某个主题。
* xml在单个Activity中使用某个主题<activity android:theme="@style/CrazyTheme"></activity>
> android内置了大量的主题资源
## &gt;属性资源
----
* 属性资源的定义:
* attr子元素定义了一个属性
* declare-styleable子元素定义了一个styleable对象包含了一组attr属性值。
* 属性资源的使用:
```
TypedArray typedArray=content.obtaintStyledattributes(attrs,R.styleable.alphaImageView);
int duration= typedArray.getInt(R.styleable.AlphaImageView_duration,0)
alphaDelta = 255 * SPEED / duration;
```
## &gt;使用原始资源
----
* 存放位置:/res/raw/或者/assets/目录下前者会在R资源清单中生成一个索引项。后者是更彻底的原始资源android需要通过AssetManager来管理该目录下的原始资源。
* R清单中的访问方式@package_name:raw/file_name;或者package_name.R.raw.file_name;
* asset中访问方式
* InputStream open(String fileName):根据文件名来获取原始资源对应的输入流
* AssetFileDescriptor openFd(String fileName):根据文件名来获取原始资源对应的AssetFileDescriptor。AssetFileDescriptor代表了一项原始资源的描述应用程序可以通过AssetFileDescriptor来获取原始资源。
## &gt;国际化和资源自适应
----
* java实现国际化的方法
将标签和提示等信息放在资源文件中资源文件是键值对对每个资源文件中的key是不变的但value随着不同的国家和语言改变。
* java程序国际化的实现方法
* java.util.ResourceBundle:加载一个国家的语言包
* java.util.Locale:用于封装一个特定的国家区域、语言环境。
* java.text.MessageFormat:用于格式化带占位符的字符串。
* baseName_language_country.properties
* baseName_laguage.properties
* baseName.properties
* java支持的国家和语言
* 程序国际化的具体实现方法:
* 在不同国家的properties文件中定义大量的键值对并将两个字节的值进行转换(native2ascii)。
* 获得当前系统的国家语言环境Locale = Locale.getDefault();
* 加载制定国家地区的properties文件,将得到的键值对放在bundle中
ResourceBundle bundle = ResourceBundle.getBundle("mess",myLocale);
* 取出键值对中的值
System.out.println(bundle.getString("hello"));
>其他程序国际化的方法也一样,能够通过(资源-国家-r语言的方式来定义不同的国家。
## &gt;自适应不同屏幕的资源
----
* 屏幕资源:屏幕尺寸,屏幕分辨率、屏幕方向
> 对dp和dpi的理解
> dp出现的原因是android手机屏幕分辨率各不相同同如果用px像素点来描述会导致在不同的手机屏幕上效果差异较大。dp的目的是为了封装屏幕的分辨率。对于任何屏幕他的dp都是480dp*320dp如果分辨率更高那么1dp就等于更多的px如果分辨率更低1dp就等于更少的px。其中dp和平乡的换算公式被称为dpi就是单位dp中含有像素的个数或者说单位inch中含有像素点的个数。
----
> 事实上dp的工作机制跟上述内容不同但是为什么采取一种错误的理解方式因为他们的机制一样但是结果不一样。
----
> 那就应该用学习html中的方法机制理解起来可能比较简单重要的是对标签的记忆组合与对审美的要求。而js和android中的java代码则对逻辑要求比较严谨。

View File

@@ -0,0 +1,79 @@
# 第七章图形与图像处理(动态处理)
----
## 逐帧动画
------
* AnimationDrawable与逐帧动画。在<animation-list/>元素中定义<item/>子元素,表示动画的全部帧,并制定持续时间即可。
```
<animation-list xmlns:android=""
android:onshot=true/false>
<item android:drawable="@package_name:drawable/resource_name"
android:duration="integer"/>
</animation-list>
```
## 补间动画
----
* android使用Animation代表抽象的动画类
* AlphaAnimation:透明度改变的动画,指定开始透明度、结束透明度、动画持续时间
* ScaleAnimation:大小缩放的动画,指定缩放中心、开始缩放比、结束缩放比、动画持续时间
* TranslateAnimation:位移变化的动画,指定开始位置、结束位置、动画持续时间
* RotateAnimation:旋转动画,旋转轴心、开始旋转角度、结束旋转角度
* 通过interpolator指定动画运行期间动态补入多少帧在哪些时刻补入。能够指定动画的变化速度。
* interpolator的实现类
* LinearInterpolator:均匀速度改变
* AccelerateInterpolator:加速
* AccelerateDecelerateinterpolator:中间加速
* CycleInterpolator:循环播放n次变化速度正玄曲线
* DecelerateInterpolator:减速
* 自定义补间动画
* 继承Animation重写抽象基类的interpolatedTime时间进行比方法和Transformation补间动画变形程度。
* Transformation代表了对图片或者视图的变形程度封装了一个Matrix对象用来对图形进行位移、倾斜、旋转等变换。封装了一个Camera对象进行三维空间变换。getMatrix():将Camera所有变换应用到matrix上
* getMatrix():Camera对应变换应用到matrix上
* rotateX:X轴旋转
* rotateY():Y轴旋转
* rotateZ():Z轴旋转
* translate():目标组件在三维空间内变换
* applyToCanvas():应用到场景当中
## 属性动画
-----
* 属性变化可以定义任意性质的变化。可以针对任何对象执行的动画,需要制定动画持续时间、动画的插值方式、动画的重复次数、重复行为、动画集、帧刷新率
* 属性动画的API
* Animator:提供了创建属性动画的基类。
* ValueAnimator:属性动画主要的时间引擎,负责计算各个帧的属性值,定义了属性动画的绝大部分核心功能。
* ObjectAnimator:对指定对象的属性执行动画是ValueAnimator的子类
* AnimatorSet:组合多个Animator并制定多个Animator的播放次序。
* IntEvaluator:计算int属性值的计算器。
* FloatEvaluator:计算float类型的计算器
* ArgbEvaluator:计算十六进制颜色值的计算器
* TypeEvaluator:计算器接口。自定义计算器。
* ValueAnimator创建属性动画的步骤
1. 调用ofInt() ofFloat() ofObject()静态方法创建ValueAnimator实例
2. 调用setXxx() 方法设置动画持续时间,差值方式、重复次数
3. 调用start()方法启动动画
4. 为ValueAnimator注册AnimatorUpdateListener监听器监听ValueAnimator计算出来的值并将这些值应用到制定对象上。通过getAnimatorValue()方法来计算值,并应用到任何对象上。
* ObjectAnimator创建属性动画的步骤
* 继承了ValueAnimator已经绑定了指定的对象直接将ValueAnimator计算的值应用到制定对象的指定属性上。
* 必须为绑定的制定对象提供特定的setter方法才行。如果没有开始值必须提供getter方法提供开始值。
* 如果对象是View需要调用onAnimationUpdate()中调用View.invalidate()方法来刷新屏幕显示。
## 使用SurfaceView实现动画
----
* SurfaceView与SurfaceHolder相互关联使用后者提供了方法
* lockCanvas()锁定surfaceView对象或者对指定区域更新。

View File

@@ -0,0 +1,113 @@
# 第七章图形与图像处理(静态处理)
> Bitmap是有像素点构成的点阵图。
------
## 使用简单的图片
----
* 通过Drawable对象进行访问。
R.drawable.file_name
@drawable/file_name
* 通过BitmapDrawable对Bitmap对象进行封装以下皆为静态方法来自BitmapFactory。
* BitmapDrawagle drawable - new BitmapDrawable(bitmap);通过Bitmap对象的到另外的图像
* createBitmap(Bitmap source,int x,int y,int width, int height):从源位图source的制定位置开始截取一个图像。
* createScaledBitmap(Bitmap src,int dstWidth,int dstHeight,boolean filter):对原来的位图进行缩放
* createBitmap(int width,int height,Bitmap.Config config):创建一个宽width、height的新位图
* createBitmap(Bitmap source,int x,int y,int width,int height,Matris m,boolean filter);截取一段图像
* decodeByteArray(byte[],int offset, int length);从指定字节数组的offset位置开始将长度length的字节解析成Bitmap对象。
* decodeFile(String pathName):从pathName指定文件中解析、创建Bitmap对象
* 用来判断是否被回收: isRecycled()
用来强制回收recycle()
* 使用静态方法导入一张图片:
* AssetManager assets=getAssets();
* InputStream assetsFile = assets.open(images[currentImg++]);
* BitmapDrawable bitmapDrawable=(BitmapDrawable) image.getDrawable();
* image.setImageBitmap(BitmapFactory.decodeStream(assetFile));
## &gt;绘图
----
* 绘图基础
* 集成View组件重写onDraw()回调方法。
*使用Canvas画布进行画图
* drawArc()
* drawBitmap()
* drawCircle()
* drawLine()
* drawLines(),drawOvl()
* drawPath(),drawPoint()
* drawPoints(),drawRect()
* drawRoundRect()
* drawText()
* drawTextOnPath()
* clipRect()
* clipRegion();
* Canvas坐标变换rotate()旋转,scale()缩放,skew()倾斜,translate()移动;
* 使用Paint进行绘图
* setARGB()设置颜色。
* setAlpha()设置透明度
* setColor()设置颜色
* setPathEffect()设置路径
* setShader()设置画笔的填充效果
* setShadowLayer()设置阴影
* setStrokeWidth()设置笔触宽度
* setStrokeJoin()设置笔转风格
* setStyle()设置paint的填充风格
* setTextAlign()设置文字对齐方式
* setTextSize()设置文本的文字大小。
* 使用Path类
* 预先将N个点连成一条路径然后在路径上绘制
* 子类ComposePathEffect/CornerPathEffect/DashPathEffect/DiscretePathEffect/SumPathEffect
* 绘图应用-绘制有用游戏
重复调用onDraw()方法每次在View组件上绘制不同的东西形成逐帧动画。
* 双缓冲画图板
* 弹球游戏
## &gt;图形特效处理
----
* 使用Matrix控制变换步骤
1. 获取Matrix对象
2. 调用Matrix的方法进行变换矩阵方法
3. 将程序Matrix所做的变换应用到指定图形或组件。
* Matrix提供的方法
* setTranslage
* setSkew()
* setTotate()
* setScale()
* Matrix 应用举例
* 键盘操作图片移动
* 移动游戏背景
* 使用drawBitmapMesh扭曲图像
* bitmap:扭曲的源位图
* meshWidth/meshHeight划分格子数
* verts扭曲后个顶点的位置
* vertOffset:控制verts数组中扭曲的开始。
* 通过drawBitmapMesh()方法对源位图扭曲绘制。
* drawBitmapMesh 应用举例
* 可揉的图片
## &gt;使用Shader填充图形
----
* 使用Shader对象指定渲染效果来填充图像。子类
* BitmapShader位图平铺
* LinerGradient线性渐变
* RadialGradient圆形渐变
* SweepGradient角度渐变
* ComposeShader组合渲染效果

View File

@@ -0,0 +1,341 @@
# 第8章Android数据存储于IO接口
-----
> Android 内置了sqlife数据库
## 使用sharePreferences
----
* 使用方法SharedPreferences负责读取数据SharedPreferences.Editor负责写入数据。
* contains()是否包含指定key的数据
* getAll()获取sharedPreferences数据里全部的keyValue对
* getXX()得到指定键的值
* clear()清空用户配置
* putXxx()存入键值对
* remove()删除键值对
* commit()提交修改
* 只能通过Context.getSharedPreferences(Stringint)方式来获取Preferences的一个实例。
## File存储
----
* FileInputStream openFileInput(String name)打开应用程序数据文件夹下的那么文件对应的输入流
* FileOutputStream openFileOutput(String name , int mode)打开应用程序数据文件夹下的name文件对应的输出流。模式分别有MODE_PRIVATE(只能被当前程序读写MODE_APPEND(追加方式,应用程序读写)MODE_WORLD_READABLE(被其他程序读取)MODE_WORLD+WRITEABLE(由其他程序读写)
* 相关方法
* getDir()创建name对应的子目录
* getFilesDir()获取应用程序的数据文件夹的绝对路径
* fileList()返回应用程序的数据文件夹下的全部文件
* deleteFile()删除数据文件夹下的制定文件
* 读取SD卡上的文件
* Environment.getExternalStorageState()判断是否插入了SD卡
* Environment.getExternalStorageDirectory()获取外部存储器
* FileInputStream、FileOutputStream、FileReader、FileWriter读写sd卡内容
* 权限配置创建删除文件的权限和向sd卡中写入数据的权限
```
<user-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<USER-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
```
## SQLife数据库
----
* sqlife数据的格式
一般数据采用的固定的静态数据类型而SQLite采用的是动态数据类型会根据存入值自动判断。SQLite具有以下五种常用的数据类型
NULL: 这个值为空值
VARCHAR(n):长度不固定且其最大长度为 n 的字串n不能超过 4000。
CHAR(n)长度固定为n的字串n不能超过 254。
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB数据块以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。
DATA :包含了 年份、月份、日期。
TIME 包含了 小时、分钟、秒。
* SQLife提供的数据库访问方式
| 方法名称 | 方法表示含义 |
| -------- |:------------:|
| openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) | 打开或创建数据库 |
| insert(String table,String nullColumnHack,ContentValues values) | 插入一条记录 |
| delete(String table,String whereClause,String[] whereArgs) | 删除一条记录 |
| query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) | 查询一条记录 |
| update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改记录 |
| execSQL(String sql) | 执行一条SQL语句 |
| close() | 关闭数据库 |
Google公司命名这些方法的名称都是非常形象的。例如openOrCreateDatabase,我们从字面英文含义就能看出这是个打开或创建数据库的方法。
* SQLife进行数据库操作的具体步骤
1. 获取SQLife对象它代表了与数据库的链接
2. 调用SQLife的方法来执行SQL语句
3. 操作SQL语句的执行结果用SimpleCursorAdaptor封装Cursor
4. 关闭SQLifeDatabase回收资源。
* SQLite3工具
* 只支持五中基本数据类型。null,integer,real,text,blob.
* 使用slite3工具执行相应的命令能够通过命令行管理数据库
* 弱类型的数据库,能够将任何数据类型保存到任何数据类型当中,在创建数据库的时候不必声明具体的数据类型。(主键除外)例如:
```
create table mytest{
id integer primary key,
name ,
gender,
pass ,
}
```
## SQLife具体的操作方式说明
1. 打开或者创建数据库
在Android 中使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)打开或者创建一个数据库。它会自动去检测是否存在这个数据库如果存在则打开不存在则创建一个数据库创建成功则返回一个SQLiteDatabase对象否则抛出异常FileNotFoundException。
下面是创建名为“stu.db”数据库的代码
openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)
参数1 数据库创建的路径
参数2 一般设置为null就可以了
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null);
2. 创建表
创建一张表的步骤很简单:
编写创建表的SQL语句
调用SQLiteDatabase的execSQL()方法来执行SQL语句
下面的代码创建了一张用户表属性列为id主键并且自动增加、sname学生姓名、snumber学号
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void createTable(SQLiteDatabase db){
//创建表SQL语句
String stu_table="create table usertable(_id integer primary key autoincrement,sname text,snumber text)";
//执行SQL语句
db.execSQL(stu_table);
}
3. 插入数据
插入数据有两种方法:
①SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,
参数1 表名称,
参数2 空列的默认值
参数3 ContentValues类型的一个封装了列名称和列值的Map
②编写插入数据的SQL语句直接调用SQLiteDatabase的execSQL()方法来执行
第一种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void insert(SQLiteDatabase db){
//实例化常量值
ContentValues cValue = new ContentValues();
//添加用户名
cValue.put("sname","xiaoming");
//添加密码
cValue.put("snumber","01005");
//调用insert()方法插入数据
db.insert("stu_table",null,cValue);
}
第二种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void insert(SQLiteDatabase db){
//插入数据SQL语句
String stu_sql="insert into stu_table(sname,snumber) values('xiaoming','01005')";
//执行SQL语句
db.execSQL(sql);
}
4. 删除数据
删除数据也有两种方法:
①调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法
参数1 表名称
参数2 删除条件
参数3 删除条件值数组
②编写删除SQL语句调用SQLiteDatabase的execSQL()方法来执行删除。
第一种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void delete(SQLiteDatabase db) {
//删除条件
String whereClause = "id=?";
//删除条件参数
String[] whereArgs = {String.valueOf(2)};
//执行删除
db.delete("stu_table",whereClause,whereArgs);
}
第二种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void delete(SQLiteDatabase db) {
//删除SQL语句
String sql = "delete from stu_table where _id = 6";
//执行SQL语句
db.execSQL(sql);
}
5. 修改数据
修改数据有两种方法:
①调用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
参数1 表名称
参数2 跟行列ContentValues类型的键值对Key-Value
参数3 更新条件where字句
参数4 更新条件数组
②编写更新的SQL语句调用SQLiteDatabase的execSQL执行更新。
第一种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void update(SQLiteDatabase db) {
//实例化内容值 ContentValues values = new ContentValues();
//在values中添加内容
values.put("snumber","101003");
//修改条件
String whereClause = "id=?";
//修改添加参数
String[] whereArgs={String.valuesOf(1)};
//修改
db.update("usertable",values,whereClause,whereArgs);
}
第二种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void update(SQLiteDatabase db){
//修改SQL语句
String sql = "update stu_table set snumber = 654321 where id = 1";
//执行SQL
db.execSQL(sql);
}
6. 查询数据
在Android中查询数据是通过Cursor类来实现的当我们使用SQLiteDatabase.query()方法时会得到一个Cursor对象Cursor指向的就是每一条数据。它提供了很多有关查询的方法具体方法如下
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
各个参数的意义说明:
参数table:表名称
参数columns:列名称数组
参数selection:条件字句相当于where
参数selectionArgs:条件字句,参数数组
参数groupBy:分组列
参数having:分组条件
参数orderBy:排序列
参数limit:分页查询限制
参数Cursor:返回值相当于结果集ResultSet
Cursor是一个游标接口提供了遍历查询结果的方法如移动指针方法move()获得列值方法getString()等.
Cursor游标常用方法
方法名称
方法描述
getCount()
获得总的数据项数
isFirst()
判断是否第一条记录
isLast()
判断是否最后一条记录
moveToFirst()
移动到第一条记录
moveToLast()
移动到最后一条记录
move(int offset)
移动到指定记录
moveToNext()
移动到下一条记录
moveToPrevious()
移动到上一条记录
getColumnIndexOrThrow(String columnName)
根据列名称获得列索引
getInt(int columnIndex)
获得指定列索引的int类型值
getString(int columnIndex)
获得指定列缩影的String类型值
下面就是用Cursor来查询数据库中的数据具体代码如下
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void query(SQLiteDatabase db) {
//查询获得游标
Cursor cursor = db.query ("usertable",null,null,null,null,null,null);
//判断游标是否为空
if(cursor.moveToFirst() {
//遍历游标
for(int i=0;i<cursor.getCount();i++){
cursor.move(i);
//获得ID
int id = cursor.getInt(0);
//获得用户名
String username=cursor.getString(1);
//获得密码
String password=cursor.getString(2);
//输出用户信息 System.out.println(id+":"+sname+":"+snumber);
}
}
}
7. 删除指定表
编写插入数据的SQL语句直接调用SQLiteDatabase的execSQL()方法来执行
[java] view plain copy print?在CODE上查看代码片派生到我的代码片
private void drop(SQLiteDatabase db){
//删除表的SQL语句
String sql ="DROP TABLE stu_table";
//执行SQL
db.execSQL(sql);
}
8. 事务处理
beginTransction()开始事务
endTransaction()结束事务
inTrasaction()判断是否处于事务当中。
setTransactionSuccessful()判断事务是提交还是回滚的函数。具体提交回滚是在endTransaction()部分实现。
9. SQLiteOpenHelper
该类是SQLiteDatabase一个辅助类。这个类主要生成一个数据库并对数据库的版本进行管理。当在程序当中调用这个类的方法getWritableDatabase()或者 getReadableDatabase()方法的时候如果当时没有数据那么Android系统就会自动生成一个数据库。 SQLiteOpenHelper 是一个抽象类我们通常需要继承它并且实现里面的3个函数
1. onCreateSQLiteDatabase
在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。
2. onUpgradeSQLiteDatabaseintint
当数据库需要升级的时候Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表并建立新的数据表当然是否还需要做其他的操作完全取决于应用的需求。
3. onOpenSQLiteDatabase
这是当打开数据库时的回调函数,一般在程序中不是很常使用。
4. synchonized SQLiteDatabase getReadableDatabase()
以读写的方式打开数据库对应的SQLliteDatebase对象
5. synchonized SQLiteDatabase getWritableDatabase()
以写的方式打开对应的对象
6. close
关闭所有打开的SQLiteDatabase对象

View File

@@ -0,0 +1,117 @@
## 新的事件监听机制
-----
* 之前是定义一个组件对象(事件源),队组建对象绑定一个监听器对象,在监听器对象中有监听同一事件不同动作的函数,函数内部对事件进行处理。从监听器的角度对事件和动作进行处理。
* 现在是直接将静态事件绑定到事件源上通过process函数运行运行事件发生时的处理方式。而且这些静态事件是已经存在于awtEvent类中的。
```
package EventHandle;
import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
/**
* @author 宙斯
* 准确的说这并不是先前的事件监听机制吧。它不存在指明的监听器。
* 应该更像一种组件自带的事件匹配功能。
* 具体步骤:
* 打开某一类型的事件匹配功能。
* 使用process函数运行某个事件
* 当事件发生时通过事件的ID匹配具体的动作。
* 匹配后设置相应的处理方式。
*/
public class baseEvent extends Frame{
private int x = 0,y = 0,flag = 0;
private Image img;
private int dx = 0,dy = 0;
public static void main(String[] args) {
baseEvent bE = new baseEvent();
}
public baseEvent(){
super();
setSize(500,500);
this.setVisible(true);
Toolkit tk = Toolkit.getDefaultToolkit();
img = tk.getImage("first.png");
//相当于添加了对Component事件的监听器似乎监听器类在底层已经直接绑定。
enableEvents(AWTEvent.COMPONENT_EVENT_MASK);
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
repaint();
}
//直接调用底层的事件处理函数
public void processComponentEvent(ComponentEvent e){
if(e.getID() == ComponentEvent.COMPONENT_MOVED){
System.out.println(e.getSource());
System.out.println(e.getID());
}
}
public void processWindowEvent(WindowEvent e){
if(e.getID() == WindowEvent.WINDOW_CLOSING){
System.exit(0);
}
}
/*
public void processMouseEvent(MouseEvent e){
if(e.getID() == MouseEvent.MOUSE_PRESSED){
System.out.println("pressed");
if((e.getX()>= x)&&(e.getX()<=x+100)&&(e.getY()>=y)&&(e.getY()<=y+100)){
flag = 1;
System.out.println(e.getX()+"..."+e.getY());
}
}
if((e.getID()==MouseEvent.MOUSE_RELEASED)&&(flag == 1)){
x = e.getX();
y = e.getY();
repaint();
flag = 0;
}
}
*/
public void processMouseEvent(MouseEvent e){
if(e.getID() == MouseEvent.MOUSE_PRESSED){
System.out.println("pressed");
if((e.getX()>= x)&&(e.getX()<=x+100)&&(e.getY()>=y)&&(e.getY()<=y+100)){
dx = e.getX()-x;
dy = e.getY()-y;
flag = 1;
System.out.println(e.getX()+"..."+e.getY());
}
}
if(e.getID()== MouseEvent.MOUSE_MOVED&&flag ==1){
x = e.getX()-dx;
y = e.getY()-dy;
System.out.println(e.getX()+"..."+e.getY());
repaint();
}
if((e.getID()==MouseEvent.MOUSE_RELEASED)&&(flag == 1)){
flag = 0;
}
}
public void paint(Graphics g){
g.drawImage(img, x, y,100,100, this);
}
}
```

View File

@@ -0,0 +1,84 @@
# 画图的标准步骤
------
package painting;
import java.awt.Frame;
import java.awt.Graphics;
/**
* 画图过程的整体框架.
* 继承了Frame类能够使用相关的框体数据。
* 实现了Rnnable接口本类能够作为一个线程被执行。
* @author 宙斯
*
*/
public class framePaint extends Frame implements Runnable{
public static void main(String [] args){
framePaint workStart = new framePaint();
}
/**
* 无参构造函数.
* 设置了窗体的基本属性。
* 创建了与本类相关的线程并且执行。
* 也就是说,这个类的对象在创建的时候,就已经执行了相关的画图代码,并且产生了一个看见的图形对象。
* 而且这个绘制的过程,会作为一个普通的线程被执行。
*/
public framePaint(){
super("framePaint");
setSize(350,350);
setVisible(true);
new Thread(this).start();
}
/**
* 实现多线程的方法.
* run方法时Runnable线程的主要方法当线程开始是执行这个方法所以画图方法在这个线程方法中被调用
* 这个方法相当于画图过程的总方法。
* @see java.lang.Runnable#run()
*/
public void run(){
repaint();
}
/**
* 实现画图的过程.
* 主要的画图方法在调用画图对象的repaint方法时这个方法被自动加载。
* @see java.awt.Window#paint(java.awt.Graphics)
*/
public void paint(Graphics g){
}
}
# Graphics类中的主要方法
-----
> 能绘制的图形:
> String 字符串
> Line 直线
> Rect 长方形
> Oval 椭圆形
> Arc 弧线
> Polygon 多边形
>
* draw系列
绘制线条图形
* fill系列
绘制平面图形,用前景色填充内容物
* clearRect()
清除指定区域内的图形
* clipRect()
截取制定区域内的图形
* copyArea()
赋值制定区域内的图形到指定区域
* get/setColor/Font
设置颜色字体等
* setClip()
截取制定形状内的图形

View File

@@ -0,0 +1,5 @@
# 底层事件处理
-----
* 在java.awt学习的时候将监听器绑定到事件源上当指定事件发生时监听器会自动匹配到相应的动作执行相应的处理方式。但在底层事件处理过程中不许要监听器能够直接获取当前发生的底层事件然后进行匹配处理。

View File

@@ -0,0 +1,14 @@
# 多线程共享受限资源
----
## &gt;多线程共享受限资源存在的问题
----
* **这个描述???**
当你坐在桌子旁边时,手里有有一把叉子,准备插起盘子里最后一块十五,当叉子碰到十五的时候,它忽然消失了。
* **解决方法**
给这个资源加锁,每个线程访问这个资源时上锁,访问结束后开锁。

View File

@@ -0,0 +1,40 @@
# 多线程的应用
------
## 多线程停止线程
----
* stop方法已经过时不能使用只能当run方法结束时才能终止线程。开启多线程程运行时代码通常是循环结构只要控制住线程通常可以让run方法结束。
* 应当设计可以修改的无限循环标志。跳出无限循环,则会终止线程。
* 当线程在循环内进入等待状态时及时线程的循环条件不满足必须终止线程但是无法执行到判断语句进行线程的终止此时必须使用interrupt()函数来达到要求。
* interrupt将处于冻结状态的线程强制转换到运行状态。此时wait()就会跑出我们处理已久的中断异常。
* 当没有指定的方式让冻结的线程回复到运行状态时这是需要对冻结进行清除。Thread提供了interrupt方法。
## 多线程 守护线程
-----
* 守护线程就是后台线程,也是一种依赖线程
* 特点:
当前台线程结束后,后台线程会自动终止,作为依赖线程,守护线程,不用强调结束。
* 方法:
setDemon()设置某个线程为守护线程
## 多线程join方法
----
* t1.join() t1抢夺cpu执行权主线程处于冻结状态t1优先执行。相当于顺序执行两个线程。主线程碰到谁的join就会等谁执行。
* 当A线程执行到了B线程的Join方法时A线程就会等待等B线程都执行完成A才会执行。join才会临时加入线程执行。当B线程进入wait时A线程也能继续执行。
* toString 方法能够显示线程的名称,线程的优先级,线程当前的分组(线程组谁调用就是谁的线程组的)
* 所有线程包括主线程默认是5。数越大优先级越高。MAX_PRIORITY,MIN_PRIORITY,
* yield()方法,当线程读到这里是,会释放执行权。这样会使所有的线程都有平均执行的效果。
## 什么时候会使用到多线程
----
* 当程序独立运算相互之间不相关的时候,可以用多线程封装一下,提高程序执行的速度

View File

@@ -0,0 +1,166 @@
# 多线程间的通讯
-----
## 多线程通讯的定义:
----
- 多个不同的线程对共同的数据进行不同的操作。
## 多线程通讯间的安全问题
-----
* 安全问题的原因
例如当多个线程对同一个数据进行不同操作时,导致各种操作的先后顺序出现混乱。
* 安全问题的解决方式
对这些线程操作数据的部分进行同步处理,使用相同的锁,将不同的部分锁起。
## 线程间通讯等待唤醒机制
-----
* 可以模仿锁的工作原理(设置标志位,记录当前是够线程占用锁内的程序,实现只能有一个线程执行锁内代码的现象)
* 步骤:
1. 设置标志位flag
2. 当标志位处于输入状态时,执行输入程序,执行完成后修改为输出状态。
3. 当标志位处于输出状态时,执行输出程序,执行完成后修改为输入状态。
## 等待唤醒机制的具体实现
----
* wait()和notify()函数必须在同步代码块或者同步函数当中使用。注意wait()会抛出中断异常。对持有监视器(锁)的线程进行操作。
* wait()和notify()的操作对象是同步中持有当前锁的线程。
* 线程的等待唤醒机制必须制定一把确定的锁。锁是任意的对象任意对象都能成为锁成为锁之后都能调用wait和notify的方法。而且这些方法都定义在Object类中。只有同一个锁上的被等待线程可以被同一个notify唤醒。等待唤醒必须是同一个锁。
## 使用新的工具类实现程序锁定和解锁
----
package painting;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author 宙斯
*
*/
public class LockerUsing {
/**
* @param args
*/
public static void main(String[] args) {
Resource2 r = new Resource2();
Produce2 pro = new Produce2(r);
Consumer2 con = new Consumer2(r);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(con);
Thread t3 = new Thread(pro);
Thread t4 = new Thread(con);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Resource2{
private String name;
private int count =1;
private boolean flag = false;
private Lock lock = new ReentrantLock();//新建了一个锁对象
private Condition condition_con = lock.newCondition();//生成了一个与锁相关的控制对象
private Condition condition_pro = lock.newCondition();
public void set(String name) throws InterruptedException{
lock.lock();
try{
while(flag)
condition_pro.await();
this.name= name+"..."+count++;
System.out.println(Thread.currentThread().getName()+"生产者:"+this.name);
flag = true;
condition_con.signal();
}
finally{
lock.unlock();//异常处理当中释放锁的动过一定要被执行
}
}
public void out() throws InterruptedException{
lock.lock();
try{
while(!flag)
condition_con.await();
System.out.println(Thread.currentThread().getName()+"消费者:"+this.name);
flag = false;
condition_pro.signalAll();
}
finally{
lock.unlock();
}
}
}
class Produce2 implements Runnable{
private Resource2 res;
Produce2(Resource2 res){
this.res = res;
}
public void run()
{
while(true){
try {
res.set("商品");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Consumer2 implements Runnable{
private Resource2 res;
Consumer2(Resource2 res){
this.res = res;
}
public void run()
{
while(true){
try {
res.out();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
* 代码的解释:
1. 单线程 -----多线程-----多线程操作同一个数据源的时候实行同步机制------带有满足条件的同步机制(睡眠唤醒机制)
2. 实现了多线程不同操作相同的程序,这个类具有模板的价值.对资源的不同操作写到资源类中并使用this资源类的锁对各种不同的操作进行上锁
3. 而非写到其他操作类中,这样能够将同步和冲突解决都封装到资源类中便于理解和操作。
4. 当线程数多于两个,比如此程序中有两个在生产两个在消费,那么标准的方式应该是通过循环判断标志位是否合格,
因为当某个线程判断满足后,但在进入之前肯能被其他线程修改标志位。
而且必须使用notifyAll()唤醒所有的线程。
5. 使用Locker及其相关类的好处
一个Locker上可以有很多condition对象执行操作也就是只唤醒对方的condition
jdk1.5实现了多线程的升级解决方案
将同步设置Synchronize替换成Lock操作可见
将Object中waitnotifynotifyAll替换成Condition对象。该对象可以Locker锁进行获取

View File

@@ -0,0 +1,48 @@
# 多线程理论补充
------
## &gt;让步机制
-----
* **yield**
thread.yield()线程执行这个函数会主动放弃执行的优先级但只是暗示别的线程能够抢到更多的资源没有确定的机制保证cpu资源一定被其他线程使用。
## &gt;休眠机制
---
* **sleep**
thread.sleep(30)线程停止执行30ms可能会跑出异常此线程调用interrupt方法中断了线程的执行。
## &gt;优先权机制
----
* **setPriority()**
thread.setPriority()通过thread类中的常量对优先级进行设定。thread.getPriority()能够获取当前线程的优先级。
## &gt;后台进程
-----
* **后台线程守护线程thread.setDaemon()**
程序运行时在后台提供的一种通用的线程当所有的非后台线程结束时后台线程守护线程自动终止。必须在线程启动之前调用方法setDaemon()将线程设置成后台线程。isDeamon判断是否为后台线程。
## &gt;加入线程
----
* **t.join(a)**
t线程此时将被挂起直到a线程结束才会被执行。当a线程结束时t.isAlive()返回为假,线程恢复。
## &gt;编码变体
-----
* **implements Runnable**
通过实现接口Runnable来达到作为线程类的方法。必须实现run方法。
* **建立有响应的用户界面**
让运算作为一个独立的线程在后台独立运行。

21
Matlab/教程/MATLAB1.md Normal file
View File

@@ -0,0 +1,21 @@
# &gt; MATLAB操作界面
---
* **操作面板**
1. 文件目录(文件结构的显示)
2. 编辑器(打开的脚本文件)
3. 命令行窗口(用于随时操作数据)
4. 工作空间(用于储存变量的空间)
5. 命令历史记录(用于储存命令行中的数据)
6. 导航栏(主页、绘图、应用程序、编辑器、发布、视图)
> 使用tab键调节嵌套中的缩进问题。
* **辅助命令**
1. path搜索文件的目录
2. help path查看帮助
3. cdcurrent directory
4. userpath用户使用的路径
5. savepath保存路径

34
Matlab/教程/MATLAB10.md Normal file
View File

@@ -0,0 +1,34 @@
# MATLAB的符号运算
## &gt; MATLAB的符号运算
***
* **符号计算基础**
1. 符号变量和符号常量``` a = sym('a'),syms b,c = sym('3')
2. 符号表达式。生成方式声明符号表达式中所有的变量为符号变量。或者直接使用sym函数生成一个符号表达式f = sym(字符串)。一些满足符号表达式的字符串能够自动转换为符号表达式
3.
* **符号函数**
1. simplify多项式规则化简
2. simple多种规则对多项式化简
3. sym()符号表达式和数值的转换使用eval()或者numeric函数。
4. 因式分解函数factor(化简) , expand展开 , collect合并同类项
5. 符号矩阵。构建方式与数值矩阵相同,符号矩阵的运算同数值矩阵相同。
6. 符号矩阵的转置transposedeterm '是共轭转置
1. subsf1,3使用3 代替原函数中的自变量,得到最终的结果。
2. 符号极限,符号微分,符号积分
3. limit(y,0)计算y函数在零点的值
4. diff(y,3)微分求解
5. int(y3)求y3的积分函数
6. int(y4,1,2)对y4从一道二积分
* **符号级数**
1. symsum符号级数求和
symsum函数名臣针对变量起始截止
2. Taylor(f函数名称针对的变量展开项数展开的函数值)
* **符号方程求解**
1. 符号代数方程
2. solve(方程表达式)
3. 符号方程组
4. [x,y] = solve('x + y',时间,'x和y是... ...')
5. 符号微分方程组
6. dsolve

65
Matlab/教程/MATLAB2.md Normal file
View File

@@ -0,0 +1,65 @@
# 命令和语句
## &gt;命令行的特点
***
* **命名和语句**
1. 字母开头,字母下划线,区分大小写
2. 不声明不定义拿来即用。
3. 分号决定语句是否输出
4. 英文省略号续行
* **赋值**
1. 等于号赋值给变量
2. 无赋值对象时默认赋值给ans
* **变量管理**
1. 工作空间窗口查看
2. who whos 查看
* **全局的文件操作**
1. 清除变量的命令clear,清除所有变量或者单个变量
2. save[文件名][变量名][-append][-ascii]
> .mat文件是一种数据文件的类型,用于储存matlab中的数据
# &gt;数据的类型和显示
---
* **format函数,控制显示**
1. short long e rat hex + bank compact loose
* **MATLAB中常见的数据类型**
1. 数值型:双精度,单精度,符号整型数据
2. 字符串、结构体、单元、多维矩阵、稀疏矩阵
3. 默认双精度double
4. unit8()将double型数据转换成无符号整型
5. double()能够将int类型转换为double类型的数据
> class(变量)能够显示一个数据的类型
* **字符串类型的访问**
1. 单引号
2. double()或者abs查看ascii值
3. char()转换为字符
4. str2num()获取字符串表面数值
5. num2str()数字表面上的字符串
* **字符串的相关操作**
eval()执行字符串类型的语句与PHP极其相似
* **结构体的建立**
结构体.成员名 =表达式
* **结构体的访问**
1. isstruct()返回结构体的类型1或者0
2. fieldnames()成员的名字
3. isfield(成员名,结构体名)一个变量是否是结构体的成员
4. rmfield()
5. getfield()
# &gt;特殊的MATLAB数据类型
****
* **单元CELL**
1. 使用大括号,允许不同类型的元素,同结构体
2. 结构体更像键值对,而单元更像是数组,无可定义的数组。

41
Matlab/教程/MATLAB3.md Normal file
View File

@@ -0,0 +1,41 @@
# 矩阵
## &gt;矩阵的建立
***
* **直接输入法**
1. 空格和逗号建立行向量
2. 分号建立列向量
* **使用M文件建立**
1. 这里的m文件就是MATLAB的脚本文件
2. 可以直接使用该文件的名字加载脚本也可以使用load命令
* **特殊矩阵的建立**
1. zeros()零矩阵
2. ones()1矩阵
* **冒号表达式**
e1:e2:e3;表示起始值:步长:结束值;
* **linespace(1,5,3)**
## &gt;矩阵的简单操作
***
* **索引矩阵**
1. 可以使用矩阵元素的行标和列标或者矩阵元素的序号来索引矩阵
2. 序号和下标之间的转换方式sub2ind(size(A),m,n);ind2sub(size(A),z);
3. [m,n] = find(A == 8);
* **重排矩阵**
1. reshape(A,m,n)大小相同
* **矩阵转置**
1. A = A'
* **矩阵拆分**
1. H = A(1,:)第一行所有列的内容。
2. H = A(2,3:5)第二行第三列到第五列
3. 向量索引和标量索引H = A([1 2],[1,2])校表索引的方法本质上是两个标量(精确定位),两个向量(生成范围)
* **删除矩阵元素**
1. 赋空值
* **矩阵扩展和压缩**
1. repmat(A,2,1)
2. unique(R)保留其中不同的数据(集合化)

31
Matlab/教程/MATLAB5.md Normal file
View File

@@ -0,0 +1,31 @@
# MATLAB的程序控制结构
## &gt;M文件
***
* **分类**
1. 命令文件=脚本文件,没有输入和返回,命令文件可以对工作空间的变量进行操作,文件内部的变量为局部变量,执行后自动清除。
2. 函数文件,可以有输入和返回。
3. 命令文件可以直接运行,函数文件必须以调用的形式运行。
* **建立和打开**
1. 可视化新建
2. edit命令新建
## &gt;程序控制结构
* **使用顺序结构的输入和输出**
1. inputpromt,'s's参数决定是否为字符串
2. disp('string')能够显示字符串或者变量。
3. pause(3)暂停函数,中间是秒数
* **使用分支结构**
1. 单分支的if语句由if决定是否执行
2. 双分支的if-else-end语句
3. 多分支结构if-elseif...else-end
4. switch语句中的case可以加任何数据类型也可以加矩阵向量数组集合
5. try分支是一种试探性的分支提高了程序的容错性。
try 语句组1
catch 语句组2
end
* **使用循环结构**
1. for循环 是在一个范围中循环
2. while循环是一个条件满足循环

38
Matlab/教程/MATLAB6.md Normal file
View File

@@ -0,0 +1,38 @@
# MATLAB中程序的编写和调试
## &gt;函数文件
***
* **基本结构**
1. function[输出参数] = 函数名([输入形参])同命令文件的不同之处在于有参数的输入和输出
2. [注释说明]
3. 函数体
4. 函数文件名和函数名称一致(不一致时使用文件名)
5. 注释信息会在help命令中显示出来
6. 也可以使用lookfor命令查找
* **函数参数可调标识变量**
1. nargin 输入参数个数(由执行命令时,实际传入参数的数量决定)
2. nargout 输出参数的个数由执行命令时被赋值项的返回值个数决定nargout的值
3. varargin 代表未知的参数变量实现了可变参数数量的输入。当输入变量多余设定好的参数是varargin作为元胞数组储存多余的变量注意MATLAB中的数组下标是从1开始的
4. varargout 实现了可变参数数量的输出。
5. 都是在函数文件内部实现的参数输入输出数量的控制。有点像巧妙地实现了函数的重载功能。
6. nargchk(2,4,nargin)可以生命输入参数的个数为2到4个。
6. error('wrongmessage')可以给出错误信息。
## &gt; 全局变量
***
* **global**
1. 使不同M文件访问同一个变量数据
2. 每一个文件中都要声明给global
## &gt; 程序调试
***
* **断点和单步**
1. 添加断点,能够一步一步执行,在执行过程中,可以对中间量进行测试和输出,载明窗口中进行操作。
* **根据错误提示,一步步调试**
1. 使用error输出错误提示然后调试
2. 使用系统中的错误提示

34
Matlab/教程/MATLAB7.md Normal file
View File

@@ -0,0 +1,34 @@
# MATLAB中的绘图功能
## &gt;二维高层绘图的基本函数
***
* **plot函数**
1. plot(x,y);
2. x和y为相同长度的向量
3. 如果plot为单个参数绘制折现图横坐标为自然数。如果参数为复数则实轴和虚轴进行绘制。可以绘制圆
4. 如果绘制过程中自变量为向量因变量为矩阵则对矩阵的每一个列向量绘制一个关于自变量的图像。也就是说如果想要在同一图中绘制函数不需要写多个plot只需要将因变量转换为矩阵就好。
5. 如果绘制过程中自变量和因变量同为高阶矩阵则会为x的每一列为自变量y的每一列为因变量绘图。
6. 注意行向量的能够组合成行向量矩阵,列项量能组合成列项量矩阵。
7. linespace()和冒号表达式均可以产生行向量
## &gt;二维高层绘图辅助操作
***
* 涉及到的函数、控制或者命令
[这里有一张图片](http://)
* 标注
* 坐标轴控制
[这里有一张图片](http://)
* 图形名称
* 曲线名称
* 图例
* 图形保持
* 窗口分割
[这里有一张图片](http://)
* 可以使用latex字符进行控制
* xlim([xmin,xmax])
* ylim([ymin,ymax])
* axis([xmin,xmax,ymin,ymax])

51
Matlab/教程/MATLAB8.md Normal file
View File

@@ -0,0 +1,51 @@
# MATLAB二维底层绘图的修饰
## &gt; 对象和句柄
> *似乎MATLAB也能满足面向对象编程的一些条件诶
> MATLAB也能实现GUI图形用户界面编程同强大的C++、Java有一拼*
***
* **对象和句柄的概念**
1. MATLAB吧构成图形的各个基本要素成为图形对象产生每一个图形对象时MATLAB会自动分配一个唯一的值用于表示这个对象成为句柄好像子对象和指向对象的指针
* **对象间的基本关系**
1. 计算机屏幕->图形窗口->(用户菜单,用户控件,坐标轴)
2. 坐标轴->(曲线,曲面,文字,图像,光源,区域,方框)
## &gt; 基本地城绘图函数
***
* **line对象**
1. ` h = line([-pi:0.01:pi],sin([-pi:0.01:pi]));`
2. 其中h成为line曲线对象的句柄。
3. line对象的修饰
* color属性
* LineWidth属性
* LineStyle属性
* Marker属性
* MarkerSize属性
4. plot函数能够产生line对象然后继续对返回的句柄进行操作、或者直接在绘制过程进行修饰。
5. ``` h1 = line('XData',[-pi:0.01:pi],'YData',sin([-pi:0.01:pi]),'LineWidth',1,'LineStyle',':','Color','r'); ```
6.
* **set底层对象的属性设置函数**
1. 可以通过生成的句柄对MATLAB中生成的操作对象进行。使用set函数进行设定。` set(h1,'LineWidth',2,'Marker','p','MarkSize','15') `
2. line对象常见的性质XData,YData,ZData,Color(y,m,c,r,g,b,w,k),DisplayName(legend ()),LineStyle(-,--,:,-.,none),LineWidth,Marker(+,o,*,.,X,s,d,'^',V,>,<,p,h,none)。MarkerEdgeColor,MarkerFaceColor,MarkerSize,Type。
* **text对象底层标注函数**
1. text是一个line的子对象可以使用text函数进行操作。
2. ht = text(0,4,'string')
3. text对象相关的属性ColorFontSizeStringRotation。
* **axes对象底层坐标轴函数**
1. axes是一个line/figure的对象可以使用axes函数进行操作
2. ``` hf = figure;
ha = axes('Parent',hf,'Position','Units','Pixels',[10,10,10,100]);```
3. 常见属性Box,GridLineStyle,Position,Units,XLabel,Ylabel,ZLabel,Xlim,Ylim,Zlim相关属性。
> 补充一点对MATLAB的认识
> MATLAB是矩阵实验室Matrix Laboratory之意。其主要提供了以下几种功能
> 1. 数值计算
> 2. 符号计算
> 3. 文字处理
> 4. 可视化建模仿真(图形功能强大)
> 5. 实时控制等功能(自动控制理论应用)
> MATLAB除了内部函数主包还有三十多种工具包用于不同领域不同需求的功能拓展。

29
Matlab/教程/MATLAB9.md Normal file
View File

@@ -0,0 +1,29 @@
# MATLAB Notebook使用简介
> 沟通MATLAB和word等微软软件功能
## &gt; Notebook的安装和启动
***
* **执行安装命令**
notebook -setup
* **执行启动命令**
1. 原理Word调用MATLAB服务器进行操作。
2. MATLAB和excel服务器之间也可以相互调用
3. 从Word中启动notebook或者从MATLAB中启动MATLAB。
## &gt; M-book中命令的运行
***
* **代码的运行**
1. 定义输入单元格式发生变化define input cell
2. 执行输入单元evalute执行已经输入的单元
3. 作用就像是直接在word中进行m脚本文件的一些相关操作当在论文中插入数据处理时用这种方法。
4. 使用[plot(a,b)]函数能够直接将图片绘制在word文档中
5. 定义自动初始化单元。define autoInit cell
* **单元组**
1. 将a和b定义为分别独立的输入单元而且其单步执行就像给word添加了一种图形绘制和数值计算的能力插件
2. 定义为输入单元组能够识别超过一行的命令。group cell。
3. 输出格式的控制。notebook options

57
Matlab/教程/matlab4.md Normal file
View File

@@ -0,0 +1,57 @@
# MATLAB的矩阵处理基础
## &gt;特殊矩阵的建立
***
* 零矩阵
* 1矩阵
* 单位矩阵eye(10) eye(m,n)
* 随机矩阵rand(m,n)randn(m,n)正态矩阵 获的(a,b)之间的随机矩阵A = a+(a-b)rand(m,n);
获得均值为u方差为s的随机矩阵y = u+sqrt(s)*randn;
> mean()求均值
> std求方差
* 魔方矩阵magic(5)行列对角线和相同
* heilbert矩阵和toeplitz矩阵
hilb(4)希尔伯特矩阵 每一个位置的元素为1/i+j
toeplitz(1:6)左上到右下的斜线元素相同
* 矩阵之间的加法和数乘;
* 矩阵的行列式det()
* 矩阵的逆inv()
* 向量的内积b的共轭转置乘以a
conj(b)'*a
dot(a,b)直接求两个向量的内积。
## &gt;线性方程组的求解
****
方法一:
得到系数矩阵A = [1,2,3;1,4,9;1,8,27];
常数向量b = [5,-2,6]';
x = inv(A)*b
方法二x =A/b
* **矩阵的相似化简和分解**
1. A = [1,2,3;4,5,6;7,8,9]jordan(A)获得A化简的jordan标准型
2. [V J] = jordan(A);获得的事相似矩阵和jordan标准型。
3. 矩阵的特征值eig
4. [E D]=eig(A)获得A的特征值和特征向量
* **向量和矩阵和范数**
1. norm(A,1)
2. norm(A,2)
3. norm(A,inf)
4. norm(A,'fro')
* **矩阵的分析**
1. 函数矩阵(有函数构成的矩阵)
>syms x
A = [sin(x) exp(x) 1;cos(x) x^2+1 log(x)];
diff(A);对矩阵求导
* **矩阵函数**
1. funm(A,@exp)通用矩阵函数
2. expm(A)
3. funm(A, @sin)
4. funm(A, @cos)

178
PHP/Yii/系列1.txt Normal file
View File

@@ -0,0 +1,178 @@
第一部分Yii2
1、作用
Yii 是一个高性能,基于组件的 PHP 框架,用于快速开发现代 Web 应用程序。.Yii 是一个通用的 Web 编程框架,可以用于开发各种基于 PHP 的 Web 应用。因为基于组件的框架结构和设计精巧的缓存支持Yii 特别适合开发大型应用如门户网站、论坛、内容管理系统CMS、电子商务项目等。
2、安装教程
通过归档文件安装?
1.从[yiiframework.com](http://www.yiiframework.com/download/yii2-basic) 下载归档文件。
2. 将下载的文件解压缩到 htdocs目录中。
3. 修改 `config/web.php` 文件,给 `cookieValidationKey` 配置项添加一个密钥(若你通过 Composer 安装,则此步骤会自动完成)
? ?'cookieValidationKey' => '输入你的密钥'
4.需要通过local/.../requirements.php检查是否满足安装yii的环境
5.如果PHP环境没有搭建好的话需要搭建PHP环境。把xampp中php.exe的目录添加到环境变量的path路径中个然后通过cmd。php -v 检测php环境是否安装和安装的版本是否满足要求。
6.然后通过local/.../web/index.php检测是否能够运行。出现congratulations就成功了。
第二部分Yii的基础知识
认识部分功能差不多就像C++模板库在使用过程中调用相应的类进行实例化自定义类继承yii基础类。使用类的属性和方法。
类,要素特性
属性、事件、行为
1.属性
在类中,属性和成员变量不同。属性是这个类固有的性质,可以定义其访问权限。而类的成员变量是构成类的一部分,是一个量,可以更改。
实现类的属性的方法:
* 继承自?yii\base\Object?。
* 声明一个用于保存该属性的私有成员变量。
* 提供getter或setter函数或两者都提供用于访问、修改上面提到的私有成员变量。 如果只提供了getter那么该属性为只读属性只提供了setter则为只写。
在Yii中由?yii\base\Object?提供了对属性的设定,因此,如果要使你的类支持属性, 必须继承自?yii\base\Object?。其中有一系列可以设置属性的方法函数
* __isset()?用于测试属性值是否不为?null
* __unset()?用于将属性值设为?null
* hasProperty()?用于测试是否有某个属性
* canGetProperty()?测试一个属性是否可读
* canSetProperty()?测试一个属性是否可写
2、事件
>使用事件可以在特定的时间地点触发执行预先设定的一段代码。事件无处不在比如你发了个微博触发了一个事件导致关注你的人看到了你新发出来的内容。在JS中也有相关的事件鼠标点击事件这时候事件会出发一系列行为。
>使用时间是需要明白的几个要素
这是一个什么事件?
谁触发了事件?
谁处理事件
事件怎么处理
事件相关的数据有哪些
>与事件相关的类
yii\base\Component或者yii\base\Event
其中定义了与事件相关的一些函数,直接定义对象的事件特性。
   public static function on($class, $name, $handler, $data = null,
$append = true)
{
// ... ...
// 用于绑定事件handler
}
public static function off($class, $name, $handler = null)
{
// ... ...
// 用于取消事件handler绑定
}
public static function hasHandlers($class, $name)
{
// ... ...
// 用于判断是否有相应的handler与事件对应
}
public static function trigger($class, $name, $event = null)
{
// ... ...
// 用于触发事件
   }
>事件的handler事件处理程序即对应的php函数
可以使用全局的PHP函数
可以使用类的成员函数
也可以使用匿名函数
>使用on函数进行绑定
  $person->on(Person::EVENT_GREET, 'person_say_hello
使用off函数解除绑定
  public function off($name, $handler = null)
trigger设置事件的发
  public function trigger($name, Event $event = null)
3、行为
>作用: 在类的外面对类的属性和方法进行补充。?通过将行为绑定到一个类,可以使类具有行为本身所定义的属性和方法,就好像类本来就有这些属性和方法一样。 而且不需要写一个新的类去继承或包含现有类。
>与行为相关的类以及绑定行为的方法
yii\base\bahavior类进行实例化定义类的对象
  // Step 1: 定义一个将绑定行为的类
class MyClass extends yii\base\Component
{
// 空的
}
// Step 2: 定义一个行为类他将绑定到MyClass上
class MyBehavior extends yii\base\Behavior
{
// 行为的一个属性
public $property1 = 'This is property in MyBehavior.';
// 行为的一个方法
public function method1()
{
return 'Method in MyBehavior is called.';
}
}
$myClass = new MyClass();
$myBehavior = new MyBehavior();
// Step 3: 将行为绑定到类上
$myClass->attachBehavior('myBehavior', $myBehavior);
// Step 4: 访问行为中的属性和方法,就和访问类自身的属性和方法一样
echo $myClass->property1;
  echo $myClass->method1();
* 从?yii\base\Component?派生自己的类,以便使用行为;
* 从?yii\base\Behavior?派生自己的行为类,里面定义行为涉及到的属性、方法;
* 将Component和Behavior绑定起来
* 像使用Component自身的属性和方法一样尽情使用行为中定义的属性和方法。
>行为类的要素
$owner?成员变量,用于指向行为的依附对象;
events()?用于表示行为所有要响应的事件;
attach()?用于将行为与Component绑定起来
deatch()?用于将行为从Component上解除。
>定义行为
4、Yii的约定
约定就像一种用的模式最常见的默认值就是一种约定。Yii框架把最通用的内容做成约定然后提高执行效率。
>Yii的目录结构每个文件中存放的内容和作用
├── backend后台的 资源包和相关配置文件
├── common公共目录可供其它应用使用的应用
├── console
├── environments
├── frontend前台存放有前端资源包和相关配置
├── nbproject
├── tests
├── vendor第三方程序目录比如composer.json的安装和yii框架本身
├── composer.json
├── composer.lock
├── init
├── init.bat
├── LICENSE.md
├── README.md
├── requirements.php
├── yii
└── yii.bat
index.php的入口文件协调各个部分的应用。
>别名
@+预定义的别名
@yii?表示Yii框架所在的目录也是?yii\BaseYii?类文件所在的位置;
@app?表示正在运行的应用的根目录,一般是?digpage.com/frontend
@vendor?表示Composer第三方库所在目录一般是?@app/vendor或?@app/../vendor?
@bower?表示Bower第三方库所在目录一般是?@vendor/bower?
@npm?表示NPM第三方库所在目录一般是?@vendor/npm?
@runtime?表示正在运行的应用的运行时用于存放运行时文件的目录,一般是?@app/runtime?
@webroot?表示正在运行的应用的入口文件?index.php?所在的目录,一般是?@app/web
@web?URL别名表示当前应用的根URL主要用于前端
@common?表示通用文件夹;
@frontend?表示前台应用所在的文件夹;
@backend?表示后台应用所在的文件夹;
@console?表示命令行应用所在的文件夹;
其他使用Composer安装的Yii扩展注册的二级别名。
>自动加载机制的约定
>环境和相关配置文件的约定。
Yii环境就是一组配置文件在不同IDE中不同人员的共同开发的过程中
提供了一种规范,是版本控制变得简单,减少了冲突和繁琐的步骤。

84
PHP/Yii/系列2.txt Normal file
View File

@@ -0,0 +1,84 @@
yii的认识和执行流程
>基础知识
快速开发
应用面向对象和类
基于MVC开发模式
>文件组成
1、models模板cnotrollers控制viexs视图conmmandstestsassets
2、config配置文件web入口文件
3、vendor核心类文件和扩展文件runtime运行时的生成文件
>框架执行流程
http://.../index.php?r=site/index
index.php是入口文件在web文件中。包含了yii的类文件。生成了一个应用实体即用哪个处理器完成那个动作
site是控制器文件对应controllers中的sitecontrollers文件里面包含许多动作函数包括actionindex
index是动作的具体名称在这个动作中调用了views下site的index.php文件
views下有视图文件由动作调用
请求->
index.php入口脚本->
应用主体->
控制器->
动作
->加载模型
->加载视图
->响应
系列二blog的制作流程
>连接数据库
创建数据库,数据表
配置config/db.php包括数据库连接的主机名数据库名用户名用户密码数据库类型
>系列三
gii代码生成工具脚手架。生成model。
快速提高开发速度
开启gii按照页面指引填写表单生成相应的模型类文件
生成增删查改的功能(做好增删查改的功能)
然后,突然增删查改功能就实现了
>系列四
代码分析
步骤
文章查看
文章修改新增
文章管理
相关方面
模型类 活动记录 控制器类 视图类
render返还
redirect重新定向跳转到另外一页
控制器类
继承自控制器类里面包含各种动作可以执行actionview()中render命令完成了转换到视图的任务
模型类
属性存放数据
规则验证数据的有效性
方法(函数)完成业务逻辑
ActiveRecord类想当于一张表对他的实例化想当于建立一个记录。而这个表中包含了很多对数据库表进行操作的方法也有一些属性来记录记录字段
每个记录可以实例化一个类,生成一个对象。这个对象的方法,就像当于对数据库中这一部分进行操纵。
activeform::begin方法修改文章的表单
moudule->load()可以通过数组对模型的快速赋值。
moudule->save() 进行有效性的检测,对应一个数组中的条件值

36
PHP/Yii/系列3.txt Normal file
View File

@@ -0,0 +1,36 @@
yii
创建模型即类
按规则自动验证
通过小部件自动生成html
命名空间
namespace声明命名空间
use调用类和模板和小部件
感觉controller就像大脑核心负责各个数据处理数据分流文件调配
在Jikecontroller里面定义了Jikecontroller类继承了controller类想当于控制器
里面含有action的方法可以处理数据。
在models里定义了JikeForm类继承了model类想当于数据库类
里面有很多数据和方法。
Yii:$app->request->post()访问输入表单的函数
model->rule()的方法,可以验证表单数据类型
model->load()给对象赋值,括号中填写对象对应的值
model->validate()验证model对象的数据是否合法
$this->reder('index-two',['model'=>$model])第一参数,视图中渲染的文件,第二个参数,传给视图的数据。
mvc
model 模型 负责和数据库的联系。
view视图 给用户展现的部分
controller控制器 控制用户请求的输入输出,主干的业务逻辑

23
PHP/Yii/系列4.txt Normal file
View File

@@ -0,0 +1,23 @@
1、现在的感觉就像是一般靠看一半靠猜然后通过别人的例子揣测可能的语法形式最终学会这一门语言。这种学习方式完全回归到了婴儿式的模仿阶段了但同样也可以通过这种模仿学习很多东西
学习过程中注意观察的内容:
命名规则
语法形式(符号的使用和一些常见的语法规则及意义)
变量和属性(继承的模板类的变量和属性名称固定可以尝试性记忆一下)
函数和方法(继承模板类的函数和方法的原型课已通过网站找到,重要的可以记录一下)
约定和机制,搞懂数据库-模板-控制器-前端视图之间的联系。
2、关于controller view和model的命名规则总结
controllers 文件名与类名相同二者的控制器名称和controller都要大写
views 文件名没有要求可以有很多, 文件夹名与控制器同名,然后大小写没有要求,
model 文件名与类名相同,首字母都要大写。模板名必须与数据库名相同才可以
3、现在开始每学到一个类类的属性类的方法都要注明其声明作用等信息
find()//->where(['status'=>1])->orderBy('age')->all()
参数无返回值一个activerecord对象包含多条记录的数组

114
PHP/Yii/系列5.txt Normal file
View File

@@ -0,0 +1,114 @@
gii的作用
生成一个model类
生成一个form表单
生成一个含有增删改查的控制器
index文件请求->响应的步骤
1、执行index文件执行入口哦文件读取配置文件读取应用实体
2、路由解析r=site/index,解析完成转向
3、执行sitecontroller/index然后做好
4、执行具体的动作
5、继续执行过滤是够满足用户权限、post数据是否合理等等条件
6、 从模型提取数据
7、放到视图模板中渲染页面
8、渲染的视图经过相应处理组件反馈给用户
三、各个部分的作用
入口脚本文件:
设定好全局变量
引入了yii的核心类
创建了应用主体
应用主体:
application博客等应用系统
在这里是web/application中的一个类的对象
管理yii的整体结构
可以用Yii::$app访问对象
id属性区分其他部分
basepath制定根目录
defaultRoute缺省的r值
控制器文件(主要工作)
yii\web\controller类继承而来
负责处理请求(接收数据)生成响应(分配数据)
有action方法组成形成动作
每个动作都会产生一个响应的前端视图页面
render负责向前端传递数据
视图文件
yii\web\view应用组件的帮助下应用视图模板文件进行构造和渲染完成。
html代码静态部分和PHP代码动态部分生成
布局文件
即相当于页面的结构。
布局文件中的$content变量是视图文件中的代码
main.php是布局文件可以仿照写布局
如何变换布局$this->layout = 布局文件名称
四、模型类
1、模型的内容
属性、属性标签、快赋值、验证规则、数据导出。
2、模板属性的定义和访问方式
属性等价于业务数据
$model = new CoForm();
$model['name']='weixi'给对象赋值
属性标签制定属相显示出来的额标签attributelabels(){}使用数组,键值对,键值对名称为属性名,值为显示名
3、块赋值
使用load函数可以直接将表单数据赋值给对象
4、验证规则
rule的内容在一个数组中有两个变量前者为数据后者为要求
$this->refresh()对页面进行刷新属于controller。
五、表单的创建
ActiveForm表单类
<?= $from->field($medel,'username')->textInput()->hint('Please enter your name')->label('Name')?>
控制器中吧model中的数据传给了视图
帮助类
html::tag()
Html::submitButton()
五、gii的应用

0
PHP/Yii/系列6.txt Normal file
View File

45
PHP/Yii/系列7.txt Normal file
View File

@@ -0,0 +1,45 @@
<?php
<div class="records-search">
<?php $form = ActiveForm::begin([
'action' => ['index'],
'method' => 'get',
]); ?>
<?= $form->field($model, 'record_id') ?>
<?= $form->field($model, 'label') ?>
<?= $form->field($model, 'time_data') ?>
<?= $form->field($model, 'user_own') ?>
<?= $form->field($model, 'set_top') ?>
<?php // echo $form->field($model, 'num_love') ?>
<?php // echo $form->field($model, 'content') ?>
<div class="form-group">
<?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
<?= Html::resetButton('Reset', ['class' => 'btn btn-default']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
//$model 是数据类,后边是数据项,提交时形成一个。
/*
对activeForm和From类的理解actioncreate和actionupdate的方法几乎一样都是项数据库中保存一条数。
前者,新建后保存,后者更改后保存
两个函数分别把一个类的变量传递给create.php 和 update.php二者接受类的对象
都把对象传递给同一张表单_from.php中的activeForm进行处理然后在返回
极大的利用了代码的重复利用性。
同时数据流完美清晰,值的学习。
模型中的isnewrecord 属性能够判断记录是新的记录还是旧的记录。
?>

36
PHP/Yii/需求分析.txt Normal file
View File

@@ -0,0 +1,36 @@
三、请销假平台(面向学生)
把学校的请假具体规定展示清楚,三天及以内由导员审核,七天及以内由副书记审核,
七天以上由院长审核,审核通过才可回家,否则按旷课处理。
登录把请假条拍照上传,系统提示如何写假条,录入信息,信息包括请假原因(不少于多少字)
,离校返校时间,请假证明(住院要有住院证明等),家庭住址,请假时间到期提醒,
设置助理,行使老师的权限进行审核。
差不多需要一个日历,每一天查看不在的人数,
请假超过两天,需要家人发短信或传真。如果拒绝请假申请,需要说明原因。
具体页面
学生:
请假页面:填写假条表单,
请假记录页面:查看自己的请假记录列表、销假
查看假条具体信息,销假(已通过状态,可以提前销假)、编辑(待审核状态)
老师:
请假管理:待审核的假条
请假列表页面:查询某一时间点的离校人数、名单、假条详细信息
请假条数据表
学号 班级 姓名 离校时间 返校时间 原因 目的地址 联系方式 请假条照片 请假证明 假条状态(待审核、已通过、已完成)

View File

@@ -0,0 +1,110 @@
## 1 教育经历
你好。我叫殷康龙,现就读于北京航空航天大学计算机学院,主要研究联邦学习在恶意软件检测领域的应用。本科就读于西北工业大学软件与微电子学院,主修软件工程。
在学校主要学习了数据结构与算法、C++程序设计、JavaEE企业级开发、面向对象程序设计、编译原理等课程综合测评成绩在250人中排名第8。
## 2 校园经历
在学校里积极参加社团和活动。曾任软微学院科创部干事,参与组织一行代码大赛和程序设计比赛。曾任西工大新闻中心副部长,负责开发新文中心的功能网站,培训技术人员,维护西工大官方微信。
## 4 主要成果
* 两次学校一等奖学金,一次华为奖学金,一次国家励志奖学金,一次电子工业出版社助学金,“优秀共青团员”称号
* 2016-2017年连续两届FIRA机器人世界杯SimuRoSot项目国际特等奖冠军Air Challenge项目国际一等奖亚军
* 2017中国机器人大赛空中机器人-无人机大战水果项目一等奖
* 2019年获得国家级大学生创新项目《基于超宽带定位技术的无人机目标追踪系统》和《基于网络爬虫和数据分析的高校信息整合系统》优秀结题
* 获得《面向学生的校园信息交流系统V1.0》《基于scrapy框架的校园信息爬虫系统》《基于网络爬虫和数据分析的高校信息整合系统》计算机软件著作权
## 3 项目经历
> 项目概述、主要工作、最终成果
### 竞技策略开发——仿真5VS5SimuRosot
* 项目概述15个人的开发团队长期开发项目C++、JAVA。工程项目主要包括数据处理模块、前场、后场、边路、底线、特殊策略、定位球策略等主要用于参加5V5 simurosot的国内比赛和国外比赛。
* 主要工作负责开发前场的相关策略主要包括策略选择模块优势前场、保守前场、边路前场、角色选择和切换模块角色的稳定性进入退出分开控制。、目标计算模块保持相对的阵型减少阵型的抖动、移动跑位模块、射门模块。使用PID控制方法对机器人控制增强了前场的稳定性。使用JAVA为团队开发了数据测试平台实现了对数据仿真、策略测试、可视化。。搭建团队开发的SVN版本控制系统方便整个团队项目开发和维护。
* 关键技术开发测试平台主要使用java swing开发跨平台图形界面提供了一系列GUI组件。主要包括数据导入模块、动态演示模块、数据显示模块。使用java io random_accessfile读取并解析file文件。使用java thread实现数据加载与数据展示的并行过程。通过事件监听与响应机制实现对数据仿真动态演示过程的控制包括仿真速度调节和仿真进度调节。使用javadoc生成标准的java文档供后续开发使用方便开发维护。
![](image/2021-04-06-21-33-39.png)
* 最终成果暑假期间带领团队前往日照参加了2017中国机器人大赛前往台湾 参加了FIRA机器人世界杯取得多项冠军。
### 大创项目——基于网络爬虫和数据分析的高校信息整合系统
* 项目概述5个人Python、MySQL。带领团队申请了《基于超宽带定位技术的无人机目标追踪系统》《基于网络爬虫和数据分析的高校信息整合系统》两个国家级大创项目后者主要是利用爬虫综合网络信息搭建web服务器对数据进行二次处理使用机器学习算法提供面向用户提供文章推荐功能、标签云索引功能和分类浏览功能面向信息发布者提供了热点倾向功能、数据分析功能。
* 主要工作项目架构、服务器搭建包括爬虫模块数据解析模块xpath、URL获取与去重模块、服务器模块MySQL数据库设计、Json数据封装、Android客户端数据请求模块HTTP请求、数据展示、数据处理模块。通过Scrapy完成网络信息爬虫构建了Mysql数据库使用Django后端框架和Bootstrap前端框架开发了项目网站使用大数据的算法对信息分析处理并将整个项目部署到腾讯云提供的CentOS服务器上。使用Github进行代码管理。
![](image/2021-04-06-21-18-56.png)
* 关键技术scrapy框架介绍。使用request模块进行爬虫通过调度去缓存下一条URL控制网站访问的频率使用xpath解析数据内容并将数据存储到mysql数据库中。
> * 1Scrapy引擎打开向爬虫模块请求其需要爬取的起始URLs
> * 2Scrapy引擎从爬虫模块那里获取到需要爬取的起始URLs将它们放入调度器模块作为待爬取的URL Requests
> * 3Scrapy 引擎向调度器模块发出请求获取下一个待爬取页面的URL
> * 4调度器模块返回下一个待爬取页面的URL给Scrapy 引擎Scrapy 引擎则将该 URL 经下载中间件模块(请求方向)转发给下载器;
> * 5当下载器模块完成页面下载后会生成一个该页面所对应的 HTTP Response并将其经下载中间件响应方向发送给Scrapy 引擎;
> * 6Scrapy 引擎从下载器模块处接收到HTTP Response 后,会将其经爬虫中间件模块(输入方向)发送给爬虫模块处理;
> * 7爬虫模块处理接收到的 HTTP Response并返回从中爬取到的Items及需要跟进的新的 URLs 给 Scrapy 引擎;
> * 8Scrapy 引擎将爬虫模块返回的Items 转发给数据流水线模块同时将爬虫模块返回的URLs 转发给调度器;
> * 9以上 2~8 的过程会一直重复执行,直到调度器模块中没有 URL Requests 时Scrapy 引擎关闭,爬虫停止。
![](image/2021-04-06-21-06-32.png)
* 关键技术Django框架。使用Apache服务器处理http请求。Django框架MVCmodel-view-control的代码架构模式。从数据库中获取数据封装成json格式最后将响应的数据传递给android客户端。
![](image/2021-04-06-21-17-24.png)
![](image/2021-04-06-21-58-13.png)
* 关键技术:数据处理算法。
* 标签计算算法jieba分词统计词频TF-IDF算法进行词频统计去除无关词汇字词的重要性随着它在文件中出现的次数成正比增加但同时会随着它在语料库中出现的频率成反比下降。
* 分类算法:学科竞赛、科研信息、行政信息、招生信息、招聘就业、校园活动、升学留学、生活娱乐这八类,使用朴素贝叶斯分类器进行分类。(基于贝叶斯公式,可以试图讲解贝叶斯公式)
* 混合推荐算法:基于协同过滤算法提取项目的基本特征(人,文章的特征,通过人阅读的其他文章给出特征,通过相似的人看的其他电影打上相似的标签)。系统采用的KNN算法目的在于匹配项目中K个相似度最高的项目,作为预测推荐输出到用具接口。
* 最终成果:两个国家级大创项目均获得优秀结题。
### 电子钱包JavaEE企业及开发项目
* 项目概述:在中科金财上市公司参与电子钱包项目的实习。
* 负责使用Spring框架和mybatis实现数据库的访问和数据处理。
### 无人机项目
* 项目概述:无人机加密通信项目开发。
* 主要工作主要是在Android平台DJ无人机的地面站android手机开发使用Java多线程和Socket编程实现无人机之间的通信连接。主要通过UDP网络通信、心跳测试保持连接、回调处理等方式实现线程通信。在加密通信过程中使用C++开发加密仿真环境。使用nodejs+electron对通信过程进行可视化。使用网页技术HTML、CSS、JavaScript做前端使用C++做为本地的后端。通过封装C++通信的代码提供C++通信接口供nodejs调用。代码的封装接口提供
* 主要成果:完成实验室项目验收。
### 补充项目——软件与微电子学院学生信息系统。PHPweb开发
* 项目概述20个人组成的团队PHP、MySQL。系统主要包括任务管理系统、证书认证系统、请销假平台、项目管理、活动会议记录、党建系统、文件管理系统、就业记录等子系统。使用PHP作为后端开发脚本使用MVCyii框架进行开发。
* 主要工作构建数据库。使用yii框架实现请销假平台包括表单管理和MySQL数据库访问。yii框架是MVC结构。由controller处理逻辑内容model封装数据库访问view视图作为界面用来渲染数据发送到前端。
![](image/2021-04-06-20-19-05.png)
* 最终成果:开发完成暑期项目实践,项目成功验收。
### ~~补充项目——企业级开发JavaEE项目考试系统~~
> 因为是java项目等日后学完java再写
### ~~补充项目———项目组织管理图书馆里系统开发~~
> 因为是java项目。
### ~~补充项目——windows通信编程。多人聊天室~~
* 项目概述:单人项目开发。
* 主要工作MFC开发界面、windows网络通信。
* 主要成果:课设。
### ~~补充项目——TensorFlowIO优化~~
* 项目概述分析TensorFlow源代码对源代码进行修改重新编译。使用mmap方法优化TensorFlow数据加载过程中的IO操作。
* 主要工作阅读源代码分析TensorFlow架构使用多线程以流的方式读取多个文件。mmap封装大文件读取过程。编译并测试TensorFlow最后的优化效果。
![](image/2021-04-06-23-26-50.png)
1. 首先阅读了TensorFlow的源代码以及相关的研究资料对TensorFlow的代码架构进行分析。
2. 第一层设备通信层负责网络通信和设备管理。设备管理模块可以实现TensorFlow的异构性提供了对不同平台不同设备的支持统一封装成相同的接口使得上层模块在调用过程中不必考虑具体的底层实现。通信模块主要通过两种协议实现不同设备之间的通信过程分别是gRPC协议和RDMA协议。
3. 第二层内核实现层实现了核心算子Operation与张量Tensor的操作。所有的算子都是以张量为操作对象依赖底层实现张量的内存分配和计算。
4. 第三层图计算层实现了计算图Graph包括本地计算流图和分布式的计算流图的实现。主要实现了计算图的创建、编译、优化和执行的细节。计算图中的每个节点都是内核实现层中的算子计算图中的每条边代表内核实现层中的张量。
5. 第四层API接口层TensorFlow提供了原始的C API的实现方便其他语言和平台进行调用。通过C API进一步实现其他语言的API方便不同语言开发者选择熟悉的语言构建计算图。
6. 第五层应用层不同的编程语言通过API接口层调用TensorFlow的内核实现相关的模型和应用。
![](image/2021-04-06-23-28-22.png)
1. 使用linux的mmap方法申请内存空间建立内存映射。
2. 使用platform模块对底层方法进行封装实现异常情况处理并记录内存映射的地址及相关信息提供上层接口
3. 利用platform模块提供的内存映射接口创建读取器复写父类中的数据读取方法。创建一个读取数据的算子并注册到内核当中提供其他语言的接口。
4. 编写前端调用内核新方法使用MmapReader模型进行数据读取。
5. 重新编译
* 最终成果:毕业答辩顺利完成。
## 5 个人能力和性格

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB