第二章
1. Activity程序的生命周期
2. 活动的启动模式:
1、standard :
默认启动模式,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用该模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例
2、SingleTop:
在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
3、 SingleTask:
单一任务。每次启动该活动时系统首先会在返回栈中检查是否存在该 活动的实例,如果发现已经存在则直接使用该实例, 并把在这个活动之上的所有活动统统出栈,如果没有 发现就会创建一个新的活动实例。
4、SingleInstance:
单一实例。此时有三个activity,ActivityA,ActivityB,ActivityC,除了ActivityB的启动模式为singleInstance,其他的启动模式都为默认的。startActivity了一个ActivityA,在ActivityA里startActivity了一个ActivityB,在ActivityB里startActivity了一个ActivityC。此时在当前的任务栈中的顺序是,ActivityA->ActivityB->ActivityC。照理来说在当前ActivityC页面按返回键,finish当前界面后应当回到ActivityB界面。但是事与愿违,奇迹出现了,页面直接回到了ActivityA。这是为什么呢?其实想想就能明白了,上面已经说过,singleInstance模式是存在于另一个任务栈中的。也就是说ActivityA和ActivityC是处于同一个任务栈中的,ActivityB则是存在另个栈中。所以当关闭了ActivityC的时候,它自然就会去找当前任务栈存在的activity。当前的activity都关闭了之后,才会去找另一个任务栈中的activity。也就是说当在ActivityC中finish之后,会回到ActivityA的界面,在ActivityA里finish之后会回到ActivityB界面。
此时有两个个activity,ActivityA,ActivityB,ActivityA的启动模式为默认的,ActivityB的启动模式为singleInstance。当在ActivityA里startActivity了ActivityB,当前页面为ActivityB。按下home键。应用退到后台。此时再点击图标进入APP,按照天理来说,此时的界面应该是ActivityB,可是奇迹又出现了,当前显示的界面是ActivityA。这是因为当重新启动的时候,系统会先去找主栈(我是这么叫的)里的activity,也就是APP中LAUNCHER的activity所处在的栈。查看是否有存在的activity。没有的话则会重新启动LAUNCHER。
第三章
- 定义界面控件方式:
a. 用XML代码定义:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/other_tv_str" />
b. 用java代码定义
TextView tv = new TextView(this);//new一个标签控件
tv.setText("Hello World");//设置显示的文本
setContentView(tv);//将该控件设置为窗口显示内容
2. 控件设置
查找文件中的ID值实例化控件 TextView text = (TextView) super.findViewById(R.id.mytext);
获取控件中的字符串 String text=tv.getText().toString();
设置控件中的字符串 text.setText(“今天天气真好");
- 常用控件
① EditText控件
android:text="请输入内容:"
获取光标后,text是默认内容
android:hint="请输入内容:
hint是提示内容
android:text="请输入内容:" android:selectAllOnFocus="true"默认全选中默认内容
android:inputType="textPassword"(限制输入类型)
如果输入文本不会显示出来
android:enabled="false"(设置不可编辑 只读)
② RadioButton
通常放在一个RadioGroup中和多个RadioButton一起用
<!-- 单选按钮 -->
<RadioGroup
android:id="@+id/yesorno"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:checkedButton="@+id/yes"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/yes"
android:text="是" />
<RadioButton
android:id="@+id/no"
android:text="否" /
</RadioGroup>
checkedButton 默认选中按钮
③ CheckButton 多选按钮
<!-- 复选框 -->
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="篮球" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="足球" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="羽毛球" />
④ ImageView
(更换图片)
<!-- 图片显示 -->
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="图片"
android:src="@drawable/img01" />
<Button
android:id="@+id/img_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="更换图片" />
//获取ImageView控件
final ImageView img = (ImageView)findViewById(R.id.img);
Button btn = (Button)findViewById(R.id.img_btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
img.setImageResource(R.drawable.ic_launcher);
}
});
点击更换图片按钮后
⑤ ImageButton 图片按钮
⑥ TimePicker 时间选择器
用法类似
// 获取时间选择器
TimePicker tp = (TimePicker) findViewById(R.id.tp);
tp.setIs24HourView(true);// 设置为24小时制
tp.setCurrentHour(12);// 设置当前显示的小时
tp.setCurrentMinute(30);// 设置当前显示的分钟
⑦ DatePicker 日期选择器
⑧ Spinner 下拉列表框
⑨ ProgressBar 进度条
表示程序正在加载一些数据
if (proBar.getVisibility() == View.VISIBLE) {// 获取进度条显示状态判断是否显示
proBar.setVisibility(View.GONE);// 设置进度条显示状态为隐藏
显示 View.VISIBLE 隐藏 View.GONE (不占用控件空间) 或View.INVISIBLE (占用控件空间只是没显示)
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"//设置进度条的样式
android:max="100"/>//给进度条设置一个最大值,然后在代码中动态更改进度条进度
4、数组的定义
在values目录中定义数组文件,文件中根节点表示以下的内容为数组,<string-array name=“ 数组名”>节点中的属性name为数组名 节点表示数组中的数据
<string-array name="citys">
<item>北京市</item>
<item>上海市</item>
<item>广州市</item>
<item>长沙市</item>
</string-array>
5、对话框
警告框
// 警告框
Dialog dialog = new AlertDialog.Builder(this).setTitle("警告框".setIcon(R.drawable.ic_launcher).setMessage("今天天气真好").create();
dialog.show();
// 创建对话框
AlertDialog.Builder ab = new AlertDialog.Builder(ViewActivity.this);
//设置对话框信息
ab.setIcon(R.drawable.ic_launcher);
ab.setTitle("删除信息");
ab.setMessage("确定删除吗?");
// 确定按钮
ab.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(ViewActivity.this, "删除成功!", Toast.LENGTH_LONG).show();
}
});
// 普通按钮
ab.setNeutralButton
// 取消按钮
ab.setNegativeButton
6、ListView控件 列表视图
使用垂直列表的方式显示多个选项,每个列表项独占一行,每行的布局都相同
查看詳細用法
SimpleAdapter简单适配器
类的主要功能是将LIst集合的数据转换为ListView可以支持的数据
7.布局管理器
- LinearLayout(线性布局):所有组件成单一的方向,即垂直或水平的(默认)
android:orientation="horizontal";//vertical垂直
android:layout_weight="1"//该属性控制水平和垂直方向某个控件所占的比例,可实现类似网页中框架布局的效果
- FrameLayout(框架布局):容器为每个加入其中的控件创建一个空白的域,所有的组件放在左上角,一个覆盖一个。
- RelativeLayout(相对布局):控件之间的位置是相对兄弟控件的位置或容器的位置。
- TableLayout(表格布局):表格布局采用行列的形式来管理UI中的控件。
要使用TableRow进行表格行的控制,之后所有组件要在TableRow中增加
第四章 数据的持久化
1、保存在内存中的数据是处于瞬时状态的,而保存在硬盘等存储设备中的数据是持久状态的
一、Android中数据持久化的方式
1、SharedPreferences存储
①一个轻量级的存储类,特别适合用于保存软件配置参数。(是用xml文件存放数据,文件存放在/data/data//shared_prefs目录下)提供一些基础的信息保存功能,所有信息按照“key=value”形式进行保存,保存信息是一些基本的数据类型,例如:int、boolean、float、long、String、StringSet
②得到SharedPreferences对象的方法:
a.Context类中的getSharePreferences()方法
此方法接收两个参数,第一个用于指定SharedPreferences文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences文件都是存在/data/data/< package name>/share_prefs/目录下的。第二个参数用于指定操作模式,目前只有MODE_PRIVATE一种可选,默认,和直接传入0效果相同,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写。
b.Activity类中的getPreference()方法
这个方法和第一个相似,不过它只接收一个操作模式参数,因为使用这个方法会自动将当前活动的类名作为SharedPreferences文件名。
c.PerferenceManager类中getDefaultSharePreferences()方法
这是一个静态方法,它只接收一个Context参数,并自动使用当前程序的包名作为前缀来命名SharedPreferences文件。
③存储数据的步骤:
a.调用SharedPreferences()对象的edit()方法来获取一个SharedPreferences.Editor对象
b.向SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean()方法,添加一个字符串则使用putString()方法…
c.调用commit()方法将添加的数据提交,从而完成数据存储操作
// 保存信息
Button btnS = (Button) findViewById(R.id.btnS);
btnS.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 获取Context中的SharedPreferences.Editor对象
SharedPreferences.Editor editor = getSharedPreferences(
"editor", MODE_PRIVATE).edit();
editor.putString("name", "张三丰");
editor.putInt("age", 00);
editor.putBoolean("married", true)
// 提交数据
editor.commit();
Toast.makeText(SpreActivity.this, "保存成功", Toast.LENGTH_LONG)
.show();
}
});
// 读取信息
Button btnL = (Button) findViewById(R.id.btnL);
btnL.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences editor = getSharedPreferences("editor",
MODE_PRIVATE);
// 读取数据
String name = editor.getString("name", " ");
int age = editor.getInt("age", 00);
boolean married = editor.getBoolean("married", false);
String info = "姓名:" + name + " 年龄:" + age + " 是否已婚:" + married;
Toast.makeText(SpreActivity.this, info, Toast.LENGTH_LONG)
.show();
// 获取文本显示框,将信息显示到其中
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(info)
}
});
2、文件存储(I/O流存储)
Android在Context类中提供了存取文件的方法
public FileInputStream openFileInput(String name)设置要打开的文件输入流
public FileOutputStream openFileOutput(String name,int mode)
name:指定的文件名,不可以包含路径,所有文件都默认存储到data/data/(packgename)/files/目录下
mode:设置操作的模
MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可 以使用Context.MODE_APPEN
MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
除此之外,Context还提供了如下几个重要的方法:
getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目
File getFilesDir():获取该应用程序的数据文件夹得绝对路径
String[] fileList():返回该应用数据文件夹的全部文件
3、SQLite数据库存储
①特点: SQLite的每个数据库都是一个文件
SQLite支持绝大部分SQL92命令,并提供简单事务功能
二、数据查询
1、Cursor类存放查询的结果集,并提供了对结果集中的记录进行访问的方法。
三、ORM