操作系统体系结构
1.1 与Windows操作系统对比
底层:C Linux
上层:Windows:网站; 同学录:app
1.2 体系结构
二、Android环境搭建(SDK)
配置:8G ->2G 模拟器:2G
2.2.1 下载JavaJDK1.8
配置环境变量
2.2.2 下载AndroidStudio(IntellijIDE)安装目录放到大的盘符下:
启动设置sdk目录;主题自己需要;
第一次启动时下载比较多;大家一定联网;等待自己编译完成。
https://blog.csdn.net/y74364/article/details/96121530
2.2.3 下载模拟器(Android手机演示)
https://blog.csdn.net/c137leo/article/details/83451548
三、项目结构
1.配置文件:配置Android项目基本信息的;
打包和编译工具
Gridle: 编 译 和 打 包 ; JavaWeb:maven功能类似; Eclipse: 项目
Android studio:项目:workspse
笔记本:需要BIOS;开启虚拟器设置需要安装虚拟加速器
尽量联网状态,网速快一点。
第二章 Android UI 开发
2.1 android运行文件
2.1.1 Android主要文件
AndroidManifest.xml: android 应用配置 文件 package 值是Java包的路径,映射到Java代码
activity_main.xml :布局文件;应用显示样式界面的文件
MainActivity.java : Java程序代码;将布局文件(页面文件)加载到应用程序中。setContentView(R.layout.activity_main);
R类:Android系统自动生成的;
Android的UI
html:
; javaScript: docutoment.ElementbyID(()): web/student/add.html
css: .test{
width:
color:
}
java:事件
2.1.2 UI
•Android应用的界面是由View和ViewGroup对象构建而成的。View类是Android系统平台上用户界面表示的基本单元,View的一些子类被统称为Widgets(工具),它们提供了诸如文本输入框和按钮之类的 UI对象的完整实现。
•ViewGroup是View的一个扩展,它可以容纳多个View,通过ViewGroup类可以创建有联系的子View组成的复合控件。
2.1.3 android布局
线性布局
• 线性布局是Android中较为常用的布局方式,它使用标签表示。
线性布局有两种方式指定控件位置,一种是水平方向,一种是竖直方向标签属性:相当于html css 样式属性; android: 开头
相对布局
页面设计复杂建议使用此布局。
添加一个组件默认:左上角对齐;android:layout_alignParentLeft=“true”
根据兄弟组件定位:组件必须要有ID值
3 TableLayout表格布局
• 表格布局就是让控件以表格的形式来排列组件的,只要将组件或信息放在单元格中,控件就可以整齐 的排列。
• 在TableLayout中,行数由TableRow对象控制的,即布局中有多少TableRow对象,就有多少行。
①如果我们直接往TableLayout中添加组件的话,那么这个组件将占满一行!
②如果我们想一行上有多个组件的话,就要添加一个TableRow的容器,把组件都丢到里面!
③tablerow中的组件个数就决定了该行有多少列,而列的宽度由该列中最宽的单元格决定
④tablerow的layout_width属性,默认是match_parent的,我们自己设置成其他的值也不会生效! 但是layout_height默认是wrapten——content的,我们却可以自己设置大小!
⑤整个表格布局的宽度取决于父容器的宽度(占满父容器本身)
⑥有多少行就要自己数啦,一个tablerow一行,一个单独的组件也一行!多少列则是看
tableRow中 的组件个数,组件最多的就是TableLayout的列数
三个常用属性
android:collapseColumns:设置需要被隐藏的列的序号 android:shrinkColumns:设置允许被收缩的列的列序号 android:stretchColumns:设置运行被拉伸的列的列序号
以上这三个属性的列号都是从0开始算的,比如shrinkColunmns = “2”,对应的是第三列! 可以设置多个, 用逗号隔开比如"0,2",如果是所有列都生效,则用"*"号即可 除了这三个常用属性,还有两个属性,分别就是跳格子以及合并单元格,这和HTML中的Table类似:
android:layout_column=“2”:表示的就是跳过第二个,直接显示到第三个格子处,从1开始算的! android:layout_span=“4”:表示合并4个单元格,也就说这个组件占4个单元格
4 GridLayout(网格布局)
可以自己设置布局中组件的排列方式可以自定义网格布局有多少行,多少列可以直接设置组件位于某行某列
可以设置组件横跨几行或者几列
默认组件放的位置:从第一行第一列开始放组件;行满了之后从下一行开始放组件。
5 FrameLayout(帧布局) 层次
刮奖效果: 两个属性:
android:foreground:*设置改帧布局容器的前景图像android:foregroundGravity:设置前景图像显示的位置
6 AbsoluteLayout(绝对布局)
绝对布局需要通过指定x、y坐标来控制每一个控件的位置,放入该布局的组件需要通过
android:layout_x和android:layout_y两个属性指定其准确的坐标值,并显示在屏幕上。
2.1.4 组件事件
• 当用户通过手指触摸UI时, 系统会自动创建对应的Event对象
•Android中提供了多种方式拦截处理不同类型的事件
• 视图本身就可以处理发生在该视图上的事件
定义布局文件里相应组件
获取到相应组件
给组件注册相应事件
使用匿名内部类
2.1.5 常用UI组件
布局文件里可以用属性设置相应组件的属性值;Java端也可以使用组件的方法设置。
dp(dip): device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用; sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
TextView文本标签
作用:显示文本内容;很少使用交互;
aaa<\b>:可以显示html标签。ClickListener:单击
Android 页 面 内 容 输 入 android:inputType:设置输入类型:文字,数字 ,日期android:hint:设置提EditText示文字
ClickListener:单击
Button普通按钮
ImageView: 图片视图显示图片(htmlimg)
CheckBox: 多选框
页面多选按钮; 题选择;爱好。多个选项时使用,
RadioButton单选按钮必须放到一个按钮组当中;
OptionMenu选项菜单
重写两个方法: onCreateOptionsMenuonOptionsItemSelected; 2.添加菜单MenuItem:
menu.add()
3.处理:
item.getItemId():判断单击了哪个菜单
ContextMenu上下文菜单
•View:setOnCreateContextMenuListener(listener)–滚动窗口,为某个视图添加创建ContextMenu的监听(需要长按触发)
•Activity: onCreateContextMenu(menu, view, menuInfo)–显示菜单的回调方法
•Activity: onContextItemSelected(MenuItem item)–当选择某个菜单项的回调方Activity:.registerForContextMenu()将上下文菜单注册到某个组件上
PopMenu弹出菜单用于在某个组件上:
进度条 Progressbar
进度条:下载时候,播放视频分类:精确精度条 带进度,
不精确进度条:圆圈 ;文件加载,视频加载时。
属性名 描述
android:animationResolution 超时的动画帧之间的毫秒 ;必须是一个整数值,如“100”。
android:indeterminate 超时的动画帧之间的毫秒 ;必须是一个整数值,如“100”。
android:indeterminateBehavior 定义当进度达到最大时,不确定模式的表现;该值必须为repeat或者cycle,repeat表示进度从0重新开始;cycle表示进度保持当前值,并且回到0
android:indeterminateDrawable 定义不确定模式是否可拉
android:indeterminateDuration 时间不定的动画
android:indeterminateOnly 限制为不定模式
android:max 定义进度的最大值
android:maxHeight 进度Widget最大高
android:miniHeight 进度Widget最小高
属性名 描述
android:animationResolution 超时的动画帧之间的毫秒 ;必须是一个整数值,如“100”。
android:indeterminate 超时的动画帧之间的毫秒 ;必须是一个整数值,如“100”。
android:indeterminateBehavior 定义当进度达到最大时,不确定模式的表现;该值必须为repeat或者cycle,repeat表示进度从0重新开始;cycle表示进度保持当前值,并且回到0
android:indeterminateDrawable 定义不确定模式是否可拉
android:indeterminateDuration 时间不定的动画
android:indeterminateOnly 限制为不定模式
android:max 定义进度的最大值
android:maxHeight 进度Widget最大高
android:miniHeight 进度Widget最小高
a属n性dr名oid:maxWidth 进描度述Widget最大宽
android:minWidth 进度Widget最小宽
android:mirrorForRtl 定义了相关画板如果需要反映在RTL模式
android:progress 设置进度的默认值,值介于0到max之间
android:secondaryProgress 定义二级进度值,值介于0到max。该进度在主进度和背景之间。比如用于网络播放视频时,二级进度用于表示缓冲进度,主进度用于表示播放进度。
android:progressDrawable 自定义drawable显示
android:interpolator 设置动画速度
进 度 条 样 式 : @android:style/Widget.ProgressBar.Horizontal:水平进度条(可以显示刻度,常用)。@android:style/Widget.ProgressBar.Small:小进度条。@android:style/Widget.ProgressBar.Large:大进度条。@android:style/Widget.ProgressBar.Inverse:不断跳跃、旋转画面的进度条。@android:style/Widget.ProgressBar.Large.Inverse:不断跳跃、旋转动画的大进度条。@android:style/Widget.ProgressBar.Small.Inverse:不断跳跃、旋转动画的小进度条。
android:max: 进 度 条 的 最 大 值 android:progress:进度条已完成进度值android:progressDrawable:设置轨道对应的Drawable对象android:indeterminate:如果设置成true,则进度条不精确显示进度
android:indeterminateDrawable:设置不显示进度的进度条的Drawable对象android:indeterminateDuration:设置不精确显示进度的持续时间android:secondaryProgress:二级进度条,类似于视频播放的一条是当前播放进度,一条是缓 冲进度,前者通过progress属性进行设置!
12.AlertDialog
在Android应用中,有多种对话框:Dialog、AlertDialog、ProgressDialog、时间、日期等对 话框。
Dialog类,是一切对话框的基类,需要注意的是,Dialog类虽然可以在界面上显示,但是并非 继承的View类,而是直接从java.lang.Object开始构造出来的,类似于Activity,Dialog也是有生 命周期的,它的生命周期由Activity来维护。Activity负责生产,保存,回复它,在生命周期的每 个阶段都有一些回调函数供系统方向调用。
AlertDialog是Dialog的一个直接子类,AlertDialog也是Android系统当中最常用的对话框之 一。一个AlertDialog可以有两个Button或3个Button,可以对一个AlertDialog设置title和message.不能直接通过AlertDialog的构造函数来生成一个AlertDialog.一般生成AlertDialog 的时候都是通过它的一个内部静态类AlertDialog.builder来构造的。
使用AlertDialog.Builder创建对话框需要了解以下几个方法:** setTitle:为对话框设置标题
setIcon:为对话框设置图标
setMessage:为对话框设置内容setView : 给对话框设置自定义样式
setItems:设置对话框要显示的一个list,一般用于显示几个命令时setMultiChoiceItems :用来设置对话框显示一系列的复选框setNeutralButton :普通按钮
setPositiveButton :给对话框添加"Yes"按钮setNegativeButton :对话框添加"No"按钮create : 创建对话框
show :显示对话框
setOnShowListener :对话框显示时触发的事件;
setOnCancelListener :对话框消失时触发的事件
自定义对话框
13 ProgressDialog
显示加载进度;以弹出形式显示;结合Dialog 与 Progressbar; API 26:不建议使用进度条对话框
DateDialog
用于显示日期设置:
构造方法初始化:month 0-11;比实际月份小1 DatePickerDialog.OnDateSetListener():事件处理
onDateSet(DatePicker view, int year, int month, int dayOfMonth):获取用户选择日期
自定义样式参照:AlertDialog
TimePickerDialog
自定义对话框
布局文件
继承类 Dialog 3.自定义样式4.java代码使用
自定义的对话框显示页面,必须加载到Dialog 内容视图上,setContentView()
//定义内部类Builder;
public static class Builder{
//自定义布局文件的组件 private ButtonyesButton; private Button noButton; private ImageView icon; private TextViewtvTitle;
private TextView tvMessage;
//基本属性
private Context context; private String title; private String message; private int iconId;//R.dri.
//定义事件监听器
private CustomDialog.OnClickListener yesListener; private CustomDialog.OnClickListener noListener;
//按钮标题
private String yesText; private String noText;
public Builder(@NonNull Context context) {
this.context=context;
}
public Builder setTitle(String title) { this.title=title;
return this;
}
public Builder setMessage(String message) { this.message = message;
return this;
}
public Builder setIcon(@DrawableRes int iconId) { this.iconId = iconId;
return this;
}
public Builder setPositiveButton(String text, final CustomDialog.OnClickListener listener) {
this.yesText =text; this.yesListener = listener; return this;
}
public Builder setNegativeButton(String text, final CustomDialog.OnClickListener listener) {
this.noText = text; this.noListener = listener; return this;
}
private void initView(View view,final Dialog dialog){
// 设 置 组 件 this.icon=view.findViewById(R.id.icon); this.tvMessage=view.findViewById(R.id.message); this.tvTitle=view.findViewById(R.id.title); this.yesButton=view.findViewById(R.id.yes); this.noButton=view.findViewById(R.id.no);
if(this.iconId!=0){
icon.setImageResource(this.iconId);
}
if(tvMessage!=null){ this.tvMessage.setText(this.message);
}
if(tvTitle!=null){ this.tvTitle.setText(this.title);
}
//没有设置取消按钮,不显示if(noText==null){
noButton.setVisibility(View.GONE);
}
//
if(yesText==null){
yesButton.setVisibility(View.GONE);
}
//设置取消按钮文本if(noText!=null){
noButton.setText(this.noText);
}
//设置确定按钮文本if(yesText!=null){
yesButton.setText(this.yesText);
}
//设置按钮事件处理if(yesListener!=null){
yesButton.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) { yesListener.onClick(dialog);
}
});
}
if(noListener!=null){
noButton.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) { noListener.onClick(dialog);
}
18.Notification
属性 方法 说明
android:completionHint setCompletionHint(CharSequence) 设置下拉菜单中的提示标题
android:completionHintView 设置下拉菜单中提示标题的视图
android:completionThreshold setThreshold(int) 设置用户至少输入几个字符才会显示提示
adnroid:dropDownAnchor
setDropDownAnchor(int) 设置下拉菜单的定位“锚点”组件,如果没有指定该属性,将使用该TextView本身作为定位”锚点“组件
adnroid:dropDownHeight setDropDownHeight(int) 设置下拉菜单的高度
android:dropDownHorizontalOffest 设置下拉菜单与文本框之间的水平偏移,下拉菜单默认与文本框左对齐
adnroid:dropDownVerticalOffest 设置下拉菜单与文本框之间的垂直偏移,下拉菜单默认紧跟文本框
android:dropDownWidth setDropDownWidth(int) 设置下拉菜单的宽度
android:popupBackground setDropDownBackgroundResource(int) 设置下拉菜单的背景
•Spinner提供了从一个数据集合中快速选择一项值的办法。默认情况下Spinner显示的是当前选择的 值,点击Spinner会弹出一个包含所有可选值的dropdown菜单,从该菜单中可以为Spinner选择一个 新值。
XML属性 方法 描述
android:dropDownHorizontalOffset setDropDownHorizontalOffset(int) 设置水平偏移量
android:dropDownSelector 列表框被选中时的背景
android:dropDownVerticalOffset setDropDownVerticalOffset(int) 设置垂直偏移量
android:dropDownWidth setDropDownWidth(int) 设置下拉框的宽度
android:gravity setGravity(int) 设置里面组件的对其方式
android:popupBackground setPopupBackgroundResource(int) 设置下拉框的背景颜色
android:prompt 该提示在下拉列表对话框显示时显示
android:spinnerMode 设置spinner的形式,有dropdown的dialog两种
android**:entries** 数据源
2.2 Androidres下的资源文件
Android res:文件夹下资源都会自动创建一个R 类常量id,资源名称就是生成常量id;
为什么使用资源文件?
更好维护app升级开发等;节省代码维护量。
资源文件有哪些类型?
文字、图片、音频视频、常量值、数组、布局文件等;(css /图片)
如何建立资源文件?
res文件下面建立资源文件;
如何使用资源文件?
4.1 xml文件里如何使用
@XXX/资源ID:XXX代表资源类型@color颜色
@String @array @drawable
4.2 java代码里如何使用
Resources res= getResources();
src:存放所有的*.Java源程序。
gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID。
assets:可以存放项目一些较大的资源文件,例如:图片、音乐、字体等。
res:可以存放项目中所有的资源文件,例如:图片(.png、.jpg)、文本等。
res/drawable-hdpi:保存高分辨率图片资源,可以使用Resources.getDrawable(id)可以获得资源类型。
res/drawable-ldpi:保存低分辩率图片资源,可以使用Resources.getDrawable(id)可以获得资源类型。
res/drawable-mdpi:保存中等分辨率图片资源,可以使用Resources.getDrawable(id)可以获得资源类型。
res/layout:存放所有的布局文件,主要是用于排列不同的显示组件,在Android程序中要读 取此配置。
res/values: 存放一些资源文件的信息,用于读取文本资源,在本文件夹之中有一些约定的文件名称: ·arrays.xml:定义数组数据;(在个这个xml命名的时候可以随便起名,因为最后用的时候只是用到写在这个xml文件中的array的名字)
使用:xml 某一个组件属性:值:@XXX/资源的ID
根据资源类型设置的:图片、文字、颜色、数组、音频视频
5.常用资源文件的使用
颜色
建立资源文件:color.xml
所有颜色值
#F4A460
#F0FFFF
#F0FFF0
#F0F8FF
#F0E68C
#F08080
#EEE8AA
#EE82EE
#E9967A
#E6E6FA
#DDA0DD
#DB7093
#DAA520
#DA70D6
#D8BFD8
#D2B48C
#D2691E
#CD853F
#CD5C5C
#C71585
#C0C0C0
#BA55D3
#B8860B
#B22222
#B0E0E6
#B0C4DE
#AFEEEE
#ADFF2F
#ADD8E6
#A52A2A
#A0522D
#9932CC
#98FB98
#9400D3
#9370DB
#90EE90
#8FBC8F
#8B0000
#8A2BE2
#87CEEB
#808000
#7FFFD4
#7FFF00
#7CFC00
#7B68EE
#6B8E23
#6A5ACD
#66CDAA
#6495ED
#5F9EA0
#556B2F
#4B0082
#48D1CC
#483D8B
#3CB371
#32CD32
#2E8B57
#228B22
#20B2AA
#1E90FF
#191970
#00FFFF
#00FFFF
#00FF7F
#00FF00
#00FA9A
#00CED1
#00BFFF
#008B8B
#008080
#008000
#006400
#0000FF
#0000CD
#00008B
#000080
#000000
图片
布局文件资源
选择器起源
设置按钮或者其他组件可以有不同状态时显示不用效果
1.建立选择起源 :类型drawable 2.设置组件状态样式
3. android:background="@drawable/btn_test"
2.4 Android高级组件
类型 特点
ArrayAdapter: 默认情况下只显示文本信息,如果要显示其它的控件时,一般都需要重写getView()方法。通常将一个数组或集合放在ArrayAdapter中。
SimpleAdapter: 它可以将静态的数据关联到XML布局文件中的某个View控件上,可 以将List集合中多个对象包装成多个列表项。
SimpleCursorAdapter: 与SimpleAdapter类似,只是用于包装Cursor提供的数据。
BaseAdapter: 一般用于扩展,扩展BaseAdapter可以对各列表项进行最大限度的定制。
ListView属性
属性 说明
android:divider 设置分割线
android:dividerHeight 设置分割线高度
android:listSelector 设置ListViewitem选中时的颜色
android:scrollbars 设置ListView的滚动条
android:fadeScrollbars 设置为true实现滚动条的自动隐藏和显示
android:headerDividersEnabled 设置为false,则不在header View之前绘制分隔条。
android:footerDividersEnabled 设置为false,则不在footer View之前绘制分隔条。
属an性droid:entries 说指明定一个数组资源(位于values下的XML数组文件),
ArrayAdapter使用: 1.准备数据源
创建适配器
给组件添加适配器
事件使用
动态加载数据
SimpleAdapter使用: 1.创建自定义布局文件
2.创建适配器
扩展Atapter使用:
案例1 带阴影的TextView
android:shadowColor:设置阴影颜色,需要与shadowRadius一起使用哦! android:shadowRadius:设置阴影的模糊程度,设为0.1就变成字体颜色了,建议使用3.0 android:shadowDx:设置阴影在水平方向的偏移,就是水平方向阴影开始的横坐标位置android:shadowDy:设置阴影在竖直方向的偏移,就是竖直方向阴影开始的纵坐标位置
案例2 EditText(输入框)
案例3 按钮交换显示
案例4手机信息页面
自定义样式:建立style 文件: 建立每一个style ,相当于css 每一个定义样式 name:名称 parent=继承父样式
值
案例 “智能输入法”
1) 利用网格布局编写出计算机的布局,并为“发送”按钮注册点击监听方法
2) 当点击“发送”按钮时,在监听方法click()里弹出Toast显示按钮被点击
第3章 Activity
3.1Activity
Activity是一个Android应用程序组件(也称为Android四大组件之一),它提供了一个屏幕,用户可以通过该屏幕进行交互以执行某些操作,例如拨打电话,拍照,发送电子邮件或查看地图。 每个活动都有一个窗口,用于绘制其用户界面。窗口通常填满屏幕,但可能比屏幕小,并漂浮在 其他窗口的顶部.
1)定义一个类继承自android.app.Activity或者其子类; 2)在res/layout目录中创建一个xml文件,用于创建Activity的布局; 3)在AndroidManifest.xml文件中注册Activity;
4)重写Activity的onCreate**()方法,并在该方法中使用setContentView()**
加载指定的布局文件;
• Activity的启动模式有四种,分别是standard、singleTop、singleTask和singleInstance。
3.2 Intent
1、Intent的概念:
Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意向、意图”。
Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
2、对于向这三种组件发送intent有不同的机制:
使用Context.startActivity() 或 Activity.startActivityForResult(),传入一个intent来启动一个activity。使用 Activity.setResult(),传入一个intent来从activity中返回结果。
将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的
service。将intent对象传给 Context.bindService()来绑定一个service。
将intent对象传给 Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver。
3.Intent的相关属性:
Intent由以下各个组成部分: component(组件):目的组件
Component属性明确指定Intent的目标组件的类名称。(属于直接Intent)
如果 component这个属性有指定的话,将直接使用它指定的组件。指定了这个属性以后, Intent的其它所有属性都是可选的。
action(动作):用来表现意图的行动
在Intent中,Action就是描述做、写等动作的,当你指明了一个Action,执行者就会依照 这个动作的指示,接受相关输入,表现对应行为,产生符合的输出。在Intent类中,定义了 一批量的动作,比如ACTION_VIEW,ACTION_PICK等, 基本涵盖了常用动作。加的动作越多,越精确。
类型 作用
ACTION_MAIN 表示程序入口
ACTION_VIEW 自动以最合适的方式显示Data
ACTION_EDIT 提供可以编辑的
ACTION_PICK 选择一个一条Data,并且返回它
ACTION_DAIL 显示Data指向的号码在拨号界面Dailer上
ACTION_CALL 拨打Data指向的号码
ACTION_SEND 发送Data到指定的地方
ACTION_SENDTO 发送多组Data到指定的地方
ACTION_RUN 运行Data,不管Data是什么
ACTION_SEARCH 执行搜索
ACTION_WEB_SEARCH 执行网上搜索
ACRION_SYNC 执同步一个Data
ACTION_INSERT 添加一个空的项到容器中
category(类别):用来表现动作的类别
一个包含Intent额外信息的字符串,表示哪种类型的组件来处理这个Intent。任何数量的
Category 描述都可以添加到Intent中,但是很多intent不需要category,
类型 作用
CATEGORY_DEFAULT 把一个组件Component设为可被implicit启动的
CATEGORY_LAUNCHER 把一个action设置为在顶级执行。并且包含这个属性的Activity 所定义的icon将取代application中定义的icon
CATEGORY_BROWSABLE 当Intent指向网络相关时,必须要添加这个类别
CATEGORY_HOME 使Intent指向Home界面
CATEGORY_PREFERENCE 定义的Activity是一个偏好面板Preference Panel
data(数据):表示与动作要操纵的数据
type(数据类型):对于data范例的描写一般Intent的数据类型能够根据数据本身进行判定,但 是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
extras(扩展信息):扩展信息;Intent可以携带的额外 key-value 数据,你可以通过调用putExtra() 方法设置数据,每一个 key对应一个 value数据。你也可以通过创建 Bundle对象来存储所有数据,然后通过调用 putExtras() 方法来设置数据。
Flags(标志位):期望这个意图的运行模式
类型 作用
FLAG_ACTIVITY_CLEAR_TOP 相当于SingleTask
FLAGE_ACTIVITY_SINGLE_TOP 相当于SingleTop
FLAG_ACTIVITY_NEW_TASK 类似于SingleInstance
FLAG_ACTIVITY_NO_HISTORY 当离开该Activity后,该Activity将被从任务栈中移除
.页面数据信息传递1.直接发送数据
2.Bundle
Intent用法
调用拨号程序
发送短信或彩信
通过浏览器打开网页
发送电子邮件
显示地图与路径规划
播放多媒体
选择图片
拍照
获取并剪切图片
打开手机应用市场
安装程序
卸载程序
进入设置界面
参数返回
页面之间传递参数: 1.构建Intent
设置接收返回结果
返回界面设置相应操作
第4章数据存储
SharedPreferences
• SharedPreferences是Android平台上一个轻量级的存储类,用于存储一些应用程序的配置参数,例 如用户名、密码、自定义参数的设置等。
文件存储
2.1 内部存储获取IO流
2.2 外部存储
1、Environment.getDataDirectory()= /data 这个方法是获取内部存储的根路径 2、getFilesDir().getAbsolutePath()= /data/user/0/packname/files这个方法是获取某个应用在内部存储中的files路径 3、getCacheDir().getAbsolutePath()= /data/user/0/packname/cache 这个方 法 是 获 取 某 个 应 用 在 内 部 存 储 中 的 cache 路 径 4 、 getDir(“myFile”, MODE_PRIVATE).getAbsolutePath()= /data/user/0/packname/app_myFile 这个方法是获取某个应用在内部存储中的自定义路径 方法2,3,4的路径中都带有包名,说明他们是属于某个应用
………………………………………………………………………………………… 5、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0 这 个方法是获取外部存储的根路径 6、
Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() =
/storage/emulated/0 这个方法是获取外部存储的根路径 7、getExternalFilesDir(“”).getAbsolutePath() =
/storage/emulated/0/Android/data/packname/files 这个方法是获取某个应用在外部存储中的
files路径 8、getExternalCacheDir().getAbsolutePath() =
/storage/emulated/0/Android/data/packname/cache 这个方法是获取某个应用在外部存储中的
cache路径
第五章SqlLite
1.自定义创建数据库类继承•SQLiteOpenHelper 2.初始化数据库
3.操作数据库
SQLiteDatabase 常用方法
方法名称 方法表示含义
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() 关闭数据库
Cursor常用方法
方法名称 方法描述
getCount() 获得总的数据项数
isFirst() 判断是否第一条记录
isLast() 判断是否最后一条记录
moveToFirst() 移动到第一条记录
moveToLast() 移动到最后一条记录
move(int offset) 移动到指定记录
moveToNext() 移动到下一条记录
moveToPrevious() 移动到上一条记录
getColumnIndexOrThrow(String columnName) 根据列名称获得列索引
getInt(int columnIndex) 获得指定列索引的int类型值
getString(int columnIndex) 获得指定列缩影的String类型值
ContentValues
在添加、修改:代表意义包装一行数据。
本质:Map集合;key=>代表的数据库表中字段,value=>字段设定值
whereClause
用占位符填充 :条件 表达式 name=?
用值直接填充::条件 表达式 name=‘AAA’;whereArgs可以不用传值
第六章 内容提供者
• 内容提供者(ContentProvider)是Android系统四大组件之一,用于保存和检索数据,是Android
系统中不同应用程序之间共享数据的接口。
•ContentProvider是不同应用程序之间进行数据交换的标准API,以Uri形式对外提供数据,允许其他 应用操作本应用数据。其他应用则使用ContentResolver,并根据ContentProvider提供的Uri操作指 定数据。
public class MyProvider extends ContentProvider {
private DBHelper helper;
private static UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);;
private static final String authority=“com.provider”;
privatestatic final int QUERYSUCCESS=1; privatestatic final intUPDATESUCCESS=2; privatestatic final intINSERTSUCCESS=3; privatestatic final intDELETESUCCESS=4;
//zy.imau.edu.cn/path com.provider/query insertupdate static{
uriMatcher.addURI(authority,“query”,QUERYSUCCESS); uriMatcher.addURI(authority,“insert”,INSERTSUCCESS); uriMatcher.addURI(authority,“update”,UPDATESUCCESS); uriMatcher.addURI(authority,“delete”,DELETESUCCESS);
}
//1次@Override
public boolean onCreate() { helper=newDBHelper(getContext()); returnfalse;
}
@Nullable @Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @NullableString sortOrder){
//1.解析Uri 正确
int code=uriMatcher.match(uri);
//2.判读是不是查询if(code==QUERYSUCCESS){
//3.操作数据
SQLiteDatabase db=helper.getReadableDatabase();
//不用关闭游标Cursor cursor=
db.query(Const.TABLE,projection,selection,selectionArgs,null,null,sortOrder)
;
return cursor;
}
return null;
}
@Nullable
内容访问者
内容观察者使用
注册内容观察者
在内容提供者添加通知内容观察者代码insert、update、delete方法中;
第七章 广播
广播(**Broadcast)**是一种运用在应用程序之间传递消息的机制。
广播接收者(**BroadcastReceiver)**是用来过滤、接收并响应广播的一类组件。广播接收者可以监听系统中的广播消息,在不同组件之间进行通信。
发送广播
广播接受者
自定义一个类继承BroadcastReceiver;重写onReceive方法
注册广播接收者
静态注册:配置文件中;
动态注册:java代码中
给本地应用发送广播
系统级别的广播
第8章 服务
服务(Service)是Android中的四大组件之一,它能够长期在后台运行且不提供用户界面。即使 用户切到另一应用程序,服务仍可以在后台运行。
2.2 绑定模式:
构建IBinder对象;自定义IBinder类继承Binder类;添加自定义方法。
onBind方法返回自定义IBinder对象。服务端:绑定服务
创建自定义连接类,实现ServiceConnection接口,重写接口方法。
运行流程:
3. 远程服务
注册文件配置:android:process=":remote" 和主线程分离;
4. 服务销毁
如果启动服务:startService(),bindService(intent,conn, Service.BIND_AUTO_CREATE);同时都使用了,只单击某一个stopService,unbindService停止都不会调用onDestroy();必须这个停止方法都点 击一次。
5. 前台服务8.0以上系统
配置权限
创建消息通知
第9章 网络编程
1.HttpURLConnection
网络请求要使用子线程;
2.Json
格式:
解析
2.1 原生APIJSONObject
2.2 Gson
引入类库到工程:创建json对应的对象实体类
2.3 Fastjson
第10章 后台
作为app 提供数据,业务管理。1.创建工程springBoot 1.1下载开发IntellijIdE:百度; 1.2配置环境:jdk maven
1.3创建project :选择springIntiazer ;官网:创建工程;
2. 创建工程结构
1.entriy: 2.controller 3.service 4.common 5.dao
3. 测试接口工具
postman:
4. Android客户端
import java.net.HttpURLConnection; import java.net.URL;
importjava.util.HashMap;
public class MyHttpUtil{
privatestatic final intTIME_OUT=5000;
private static URLurl;
private static HttpURLConnection connection;
private static InputStream inputStream;
public staticvoiddoGet(final String urlStr,finalHttpCallbackListener listener){
new Thread(new Runnable(){ @Override
public void run(){ try {
StringBuffer data=new StringBuffer(); String line;
//1.构建请求地址
url=new URL(urlStr);
//2.建立连接
connection= (HttpURLConnection) url.openConnection();
//3.设置请求信息connection.setConnectTimeout(TIME_OUT); connection.setRequestMethod(“GET”);
//4.判断请求连接状态if(connection.getResponseCode()==200)
{
//5.处理响应内容inputStream=connection.getInputStream();
InputStreamReader isr=new InputStreamReader(inputStream,“utf-8”);
BufferedReader reader=new BufferedReader(isr);
while((line=reader.readLine())!=null)
{
data.append(line);
}
//6.数据返回:写一个接口回调接口,消息通知
if(listener!=null){ listener.onFinsh(data.toString());
}
}
}catch (Exception e){ e.printStackTrace();
}finally {
if(connection!=null){ connection.disconnect();
}
}
}
}).start();
}
public staticvoiddoPost(final String urlStr,finalHashMap
new Thread(new Runnable() { @Override
public void run() {
try {
StringBuffer data=new StringBuffer();
//1.参数转换json
StringstrEntity= JSON.toJSONString(params);
String line;
//1.构建请求地址url=new URL(urlStr);
//2.建立连接
connection= (HttpURLConnection) url.openConnection();
//3.设置请求信息connection.setConnectTimeout(TIME_OUT); connection.setRequestMethod(“POST”); connection.setRequestProperty(“Content-Type”,
“application/json”);//使用的是json请求类型
connection.setRequestProperty(“Content-Length”, strEntity.length()+"");
connection.setDoInput(true); connection.setDoOutput(true);
//将参数写入到后台connection.getOutputStream().write(strEntity.getBytes());
//4.判断请求连接状态if(connection.getResponseCode()==200)
{
//5.处理响应内容inputStream=connection.getInputStream();
InputStreamReader isr=new InputStreamReader(inputStream,“utf-8”);
import com.google.gson.JsonObject;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity {
private EditText uname; private EditText upass;
private Handler handler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) { super.handleMessage(msg);
if((Integer) msg.obj==10000){
Intent intent=new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
}else{
Toast.makeText(MainActivity.this,“用户名密码错误,重新输入”,Toast.LENGTH_LONG).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); uname=findViewById(R.id.name); upass=findViewById(R.id.pass);
}
//登录按钮事件方法
public void login(View view){
//1.获取输入用户名密码
String name=uname.getText().toString(); String pass=upass.getText().toString();
//2.验证输入…
if("".equals(name)||name==null){
Toast.makeText(MainActivity.this,“请输入用户名”,Toast.LENGTH_LONG).show();
uname.setFocusable(true);
}else if("".equals(pass)||pass==null){
Toast.makeText(MainActivity.this,“请输入密 码”,Toast.LENGTH_LONG).show();
upass.setFocusable(true);
}else{
//3.请求后台:用户名 密码查询用户名HashMap
// 访 问 地 址 : 本 地 的 电 脑 :localhost 10.0.2.2 MyHttpUtil.doPost(“http://10.0.2.2:8008/user/login”, params,new
MyHttpUtil.HttpCallbackListener() {
@Override
public void onFinsh(String response) {
System.out.println(response);
//4.解析后台数据:
//普通json串解析;
//定义一个服务后台一致的实体类;对象解析 JSONObject obj=JSON.parseObject(response);
int code= obj.getInteger(“code”);
//发送消息
Message message=new Message();
//判断if(code==10000){
message.what=1; message.obj=10000;
}else{
message.what=1; message.obj=10001;
}
handler.sendMessage(message);
}
});
}
}
}
学生管理主界面
在这里插入代码片