Android应用程序设计提纲
备注:以下所有属性均省略了命名空间android:
一句话解释:
什么是Context(上下文)?
当我们断章取义的去理解一句话的时候,会发现没办法理解。
所以要完整的理解就必须结合文章的上下文。
一段程序如果不完整,当然就无法运行。
在Android中我们可以将Context理解为环境。
环境中啥都有:
比如空气、生物、土壤……
对应到程序中就是外部变量、对象…..
要获取结果,就需要从环境中获取。
例如:
//创建Intent对象,指定启动的类名SecondActivity
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
//启动Activity
startActivity(intent);
Intent(启动Activity的上下文,需要启动的Activity类名)
要实现Activity跳转,那必然是要基于当前的MainActivity。
所以没有MainActivity作为基础,就不能实现跳转。
1. 第一章 Android入门
【知识点】
- 1.1.3 Android系统架构
- 应用程序层(Application)使用Java编写应用程序
- 应用程序框架层(Application Framework) 提供API
- 系统运行库层(Libraries)包含核心类库。
- Linux内核层(Linux Kernel) Android系统基于Linux内核
- 1.3.2项目文件
- 布局文件(主要用于展示Android项目的界面)
- Activity文件(主要用于完成界面的交互功能)
(3)1.3.3 Android项目结构
- src
- 各种资源文件
- AndroidManifest.xml文件
- 开发时用到的Activity
- res
- values目录文件
- drawable文件夹
- libs
- 第三方JAR包
- build
- 各种源文件
- R.Java文件
- 1.3.4 AndroidManifest.xml
是每个Android项目所必须的,是对整个Android应用的全局描述。
包含:
记忆关键词(包组版权)
- 应用程序的包名
- 应用程序的组件
- 应用程序的版本要求
- 应用程序使用到的权限。
2. 第二章 Android应用界面
【知识点】
(1)2.2布局管理器
掌握线性布局、相对布局的相应的标签名及常用的属性的含义。
<RelativeLayout 相对布局
默认生成的布局类型
layout_alignParentTop 是否对齐父布局顶部
></RelativeLayout>
<LinearLayout 线性布局
orientation(朝向)=”horizontal(水平)/vertical(垂直)”
></LinearLayout>
(2)2.3 Android控件详解
掌握各个控件的标签名及常用的属性。
<TextView 文本框
layout_width=”wrap_content” 宽度适应内容
layout_height=”wrap_content” 高度适应内容
textColor 设置字体颜色
textSize 设置字体大小
gravity=”center” 设置字体居中显示
/>
<EditText 输入框
inputType属性设置输入的类型
hint属性提示用户当前文本框输入什么内容
/>
<Button 按钮
background 为按钮设置背景样式
text 设置button的显示的内容(所有内容组件都有此属性)
/>
<ImageView 图像视图
src 设置图片来源
/>
<RadioButton 单选按钮(类似于收音机的按钮,按一个就会弹起一个)
RadioButton通常和RadioGroup(理解为容器,可以往里塞单个单个的RadioButton组件)一起使用。
checked 指定RadioButton初始时是否被选中
/>
<CheckBox 复选框
checked 指定CheckBox初始时是否被选中
/>
<ProgressBar 进度条
max 设置进度条的最大值
progress 设置进度条已完成进度值
/>
<SeekBar 拖动条
thumb 指定滑块外观
/>
掌握ListView与ArrayAdapter的综合运用,参考实例一(P33)。
<ListView (以垂直列表的形式显示所有列表项)
>
使用步骤:
记忆方法:Lvae
- 在布局文件中添加ListView组件
- 在values文件夹下添加新的arrays.xml文件
- 在ListView组件中通过entries属性设置,把数组元素加载到ListView中
</ListView>
实例:基于ArrayAdapter创建ListView
- 界面布局基于数组创建ListView的布局代码一样。(id设置为listview1)
- Activity代码(即Java后置代码)
- 在MainActivity类onCreate方法中书写
ListView listView=findViewById(R.id.listview1);
//定义一个数组,用来填充listview
String[] arr={"章节1","章节2","章节3"};
//实例化泛型操作类ArrayAdapter
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,arr);
//为listview设置adapter
listView.setAdapter(adapter);
- 创建ArrayAdapter需要指定的三个参数
- Context this
- textViewResourceId android.R.layout.simple_expandable_list_item_1
- 数组/List arr
- Toast的使用(Toast.makeText)
记忆此段代码:
Toast.makeText(this,”要显示的文字”,Toast.LENGTH_SHORT).show();
makeText()方法参数的含义:
- 上下文环境
- 要显示的文字
- 显示时间的长短
- 第三章 Activity
【知识点】
- Activity的创建(能灵活运用)
- 定义一个类继承自android.app.Activity或其子类
- 在res/layout目录下创建一个xml文件,用于创建Activity的布局
- 在app/manifest目录下的AndroidManifest.xml清单文件中注册Activity
- 覆写Activity的onCreate()方法,并在该方法中使用setContentView()加载指定的布局文件。例如:
setContentView(R.layout.activity_main);
- Activity的三种状态及回调方法。
三种状态:(Run Pause Stop—RPS)
- 运行状态
- 暂停状态
- 停止状态
Activity从一种状态变到另一种状态需要用到回调方法。
回调方法:(CSRRSD)
- onCreate() Activity的实例被Android系统创建后第一个调用。设置屏幕布局、初始化数据、事件处理
- onStart() Acitivity可见时执行
- onRestart() 再次可见时执行
- onResume() Activity获取焦点时执行
- onPause() Activity失去焦点时执行
- onStop() 进入后台时执行
- onDestroy() Activity销毁时执行
- Activity的单击事件(能灵活运用)
Button button=findViewById(R.id.buttton);
//匿名内部类方式
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
//点击后执行的逻辑代码
}
});
(4)3.2.2 显示Intent(掌握页面跳转的方法)
//创建Intent对象,指定启动的类名SecondActivity
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
//启动Activity
startActivity(intent);
Intent()构造方法参数:
- 启动Activity的上下文
- 需要启动的Activity类名
(5)3.3 Activity中的数据传递方式,参考3.4用户注册案例
传递参数
传递较少参数
intent调用putExtra()将数据存储进去。
传递较少参数
String str="android";
Intent intent=new Intent(this,SecondActivity.class);
//传递参数
//putExtra()是以key-value的形式
intent.putExtra("rec",str);
startActivity(intent);
//SecondActivity接收参数
Intent intent=this.getIntent();
String receive=intent.getStringExtra("rec");
传递较多参数
//使用Intent传递多个参数
Intent intent=new Intent(this,SecondActivity.class);
Bundle bundle=new Bundle();
//以key-value的形式
bundle.putString("name","渣渣辉");
bundle.putString("sex","男");
//bundle作为容器装载了数据
//intent作为通信媒介
intent.putExtras(bundle);
//启动Activity
startActivity(intent);
Bundle是用来传递数据的“容器”,它保存的数据,是以key-value(键值对)的形式存在的。
必知必会:
Bundle相当于传递数据的“容器”,它保存的数据,是以key-value(键值对)的形式存在的。
bundle实例是容器
intent实例是通信媒介
接收参数:
//在SecondActivity中取出参数
Intent intent=this.getIntent();
Bundle bundle=intent.getExtras();
//根据key取出value
String name=bundle.getString("name");
String sex=bundle.getString("sex");
4. 第四章 Android事件处理
【知识点】
- 基于监听的事件处理(参照图4-1实例)
实现OnClickListener接口
public class MainActivity extends Activity implements View.OnClickListener{
Button button=findViewById(R.id.button);
@Override
public void OnClick(View view){
//逻辑代码
}
}
使用匿名内部类的方式注册事件监听器
Button button=findViewById(R.id.buttton);
//匿名内部类方式
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
//点击后执行的逻辑代码
}
});
- Ansync Task异步类的作用及常用的方法。
作用:
- 实现多线程
- 异步通信、消息传递
用例:
获取网络数据、动态更改UI界面
AsyncTask使用步骤:
1. 创建 AsyncTask 子类
2. 创建 AsyncTask子类的实例对象(即 任务实例)
3. 手动调用execute()从而执行异步线程任务
private class MyTask extends AsyncTask<Params, Progress, Result> {
....
// 方法1:onPreExecute()
// 作用:执行 线程任务前的操作
// 注:根据需求复写
@Override
protected void onPreExecute() {
...
}
// 方法2:doInBackground()
// 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果
// 注:必须复写,从而自定义线程任务
@Override
protected String doInBackground(String... params) {
...// 自定义的线程任务
// 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()
publishProgress(count);
}
// 方法3:onProgressUpdate()
// 作用:在主线程 显示线程任务执行的进度
// 注:根据需求复写
@Override
protected void onProgressUpdate(Integer... progresses) {
...
}
// 方法4:onPostExecute()
// 作用:接收线程任务执行结果、将执行结果显示到UI组件
// 注:必须复写,从而自定义UI操作
@Override
protected void onPostExecute(String result) {
...// UI操作
}
// 方法5:onCancelled()
// 作用:将异步任务设置为:取消状态
@Override
protected void onCancelled() {
...
}
}
/**
* 步骤2:创建AsyncTask子类的实例对象(即 任务实例)
* 注:AsyncTask子类的实例必须在UI线程中创建
*/
MyTask mTask = new MyTask();
/**
* 步骤3:手动调用execute(Params... params) 从而执行异步线程任务
* 注:
* a. 必须在UI线程中调用
* b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常
* c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()
* d. 不能手动调用上述方法
*/
mTask.execute();
doInBackground()执行完后会自动调用onPostExecute();
5. 第五章 Fragment基础
【知识点】
- 掌握Fragment的状态及常用回调方法
三种状态:(Run Pause Stop—RPS)
- 运行状态
- 暂停状态
- 停止状态
回调方法:(标红为Fragment比Activity多的额外回调)
- onAttach() 当Fragment与Activity关联时调用
- onCreate()
- onCreateView() 创建该Fragment的视图(加载布局)时调用
- onActivityCreated() 当Activity的onCreate()方法返回时调用
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroyView() 当与该Fragment关联的视图被移除时调用
- onDestroy()
- onDetach() 当Fragment与Activity关联被取消时调用
Fragment必须是依存于Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。
- 掌握onCreateView()、LayoutInflater中inflate()方法的用法。
我们已经知道了onCreateView() 是在创建该Fragment的视图(加载布局)时调用。
新建一个Left_Fragment类,继承自Fragment
public class Left_Fragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle saveInstanceStFate){
View view=inflater.inflate(R.layout.left_fragment,container,false);
return view;
}
}
LayoutInflater 布局服务
inflater 本身有打气筒的意思
往视图层加载布局就是inflate(打气)
所以其参数中应该有left_fragment.xml布局文件,装载布局文件的容器container,以及是否需要保存实例状态。
6. 第六章 Android数据存储
【知识点】
- 掌握文件存储基本操作(参照6.2.2实例)
Android数据存储方式共有5种:
- SharedPreferences
- 网络存储
- 文件存储
- 外部存储
- SQLite
Android中文件存储分为:
-
-
- 外部存储 将文件存储到外部设备(SD卡等)
-
- 首先需要检查外围设备是否存在。
- 进行读写操作。
- 在AndroidManifest.xml种添加读写权限
-
- 内部存储 将应用程序数据以文件形式存储在应用程序目录下(data/data<packagename/file/目录下>),该文件属于应用程序私有。
-
FileOutputStream openFileOutput(String name,int mode);
FileInputStream openFileInput(String name);
name表示文件名
mode表示文件的操作权限:
- MODE_PRIVATE 默认操作权限,只能被当前应用程序读写
- MODE_APPEND 可以添加文件的内容
- MODE_WORLD_READABLE 可以被其他程序读取,安全性低
- MODE_WORLD_WRITEABLE 可以被其他程序写入,安全性低
内部存储方式存储数据(write)
//文件名称
String file_name="text.txt";
//写入文件的数据
String str="Android";
FileOutputStream file_out;
try{
//保存输入的数据
//openFileOutput()由Context提供
file_out=openFileOutput(file_name,MODE_PRIVATE);
file_out.write(str.getBytes());
file_out.close();
}
catch(Exception e){
e.printStackTrace();
}
字节流:
-InputStream
-OutputStream
InputStream属于字节流
字节流操作的数据单元是8位的字节 (Byte 1字节)
内部存储方式读取数据(read)
//文件名称
String file_name="text.txt";
//保存读取的数据
String str="";
FileInputStream file_in;
try{
file_in=openFileInput(file_name);
//file_in.available() 返回的实际可读字节数
byte[] buffer=new byte[file_in.available()];
file_in.read(buffer);
str=new String(buffer);
}
catch(Exception e){
e.printStackTrace();
}
字节流:
-InputStream
-OutputStream
InputStream属于字节流
字节流操作的数据单元是8位的字节 (Byte 1字节)
- 掌握SQLite数据库基本操作(参照6.5.4实例),主要考察SQLiteOpenHelper、SQLiteDatabase、Cursor的常用方法。
SQLiteOpenHelper
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据的创建和版本的更新。
实现两个回调方法:
onCreate(SQLiteDatabase db)
onUpgrade(SQLiteDatabase,int oldVersion,int newVersion)
常用方法
getWritableDatabase()
getReadableDatabase()
这两个方法用于获取SQLiteDatabase实例
getReadableDatabase()调用实例:
例如在MainActivity类中调用User_database
......
@Override
protected void onCreate(){
.....
User_database user=new User_database(MainActivity.this);
SQLiteDatabase sqLiteDatabase=user.getReadableDatabase();
}
这里就使用了SQLiteOpenHelper中的getReadableDatabase()来返回SQLiteDatabase实例
SQLite数据库的创建
public class User_database extends SQLiteOpenHelper{
//构造方法
public User_database(Context context){
super(context,"user_db",null,1);
}
//数据库第一次创建时调用该方法
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase){
String sql="create table user(id integer primary key autoincrement,username varchar(20),paswd varchar(20))";
//数据库执行语句
sqLiteDatabase.execSQL(sql);
}
//数据库版本号更新时调用
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase,int old,int new){
}
}
SQLiteDatabase类(SQLiteOpenHelper类中的getWritableDatabase()和getReadableDatabase()方法返回该类对象)
使用SQLiteDatabase类可以完成数据库操作 增 删 改 查。
SQLiteDatabase常用方法:
- long insert(String table,String nullColumnHack,ContentValues values)
- insert()方法插入的一行记录使用ContentValue存放,ContentValue类似于Map,使用key-value的形式存放
- update() 修改满足条件的数据
- delete() 删除满足条件的数据
- exceSQL() 执行一条占位符号SQL语句
- close() 关闭数据库
- Cursor query() 用于查询数据
数据的添加
public void Insert(SQLiteDatabase sqLiteDatabase){
ContentValues values=new ContentValues();
values.put("username","蔡徐坤");
values.put("paswd","123456");
//将数据插入到名为user的表中,数据在容器values
sqLiteDatabase.insert("user",null,values);
sqLiteDatabase.close();
}
一行记录使用ContentValue存放,ContentValue类似于Map,使用key-value的形式存放
Map是集合类,集合类是容器类。
所以将ContentValues想象成容器 装数据
数据的删除
public void Delete(SQLiteDatabase sqLiteDatabase){
sqLiteDatabase.delete("user","username=?",new String[]{"蔡徐坤"});
sqLiteDatabase.close();
}
delete()参数
第一个参数:表名
第二个参数:需要删除的属性名,?代表占位符号 key
第三个参数:属性名的属性值 value
数据的更新
public void Update(SQLiteDatabase sqLiteDatabase){
ContentValues values=new ContentValues();
//以key-value的形式插入
values.put("paswad","111111");
//执行修改的方法(修改 username=蔡徐坤 的密码)
sqLiteDatabase.update("user",values,"username=?",new String[]{"蔡徐坤"});
}
一行记录使用ContentValues存放,ContentValues类似于Map,使用key-value的形式存放
Map是集合类,集合类是容器类。
所以将ContentValues想象成容器 装数据
Cursor接口
Cursor是一个游标接口,在数据库中作为返回值,相当于结果集ResultSet。
常用方法:
- moveToFirst() 移动游标到第一行
- moveToNext() 移动游标到下一行 (常用于查询)
结果集的查询
public List<userInfo> Querydata(SQLiteDatabase sqLiteDatabase){
Cursor cursor=sqLiteDatabase.query("user",null,null,null,null,"id ASC");
List<userInfo> list=new ArrayList<userInfo>();
while(cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("id"));
String username=cursor.getString(1); //获取第二列的记录
String paswd=cursor.getString(2);//获取第三列的记录
//将每一行的记录到装到list集合中
list.add(new userInfo(id,username,paswd));
}
cursor.close();
sqLiteDatabase.close();
return list;
}
List<userInfo> list 用于定义只能是userInfo类的对象才能装入集合
while(cursor.moveToNext())的作用就是遍历table的每一行
cursor.moveToNext()就是移动到下一行
- 第七章 ContentProvider的使用
【知识点】
掌握ContentProvider、ContentResolver类的作用,及其类中抽象方法具体的作用。
ContentProvider用于存储和检索数据,是Android中不同应用程序之间共享数据的接口。
ContentProvider以Uri的形式对外提供数据,ContentResolver通过Uri对数据进行操作。
相当于
ContentProvider对数据进行了标识,
ContentResolver则用于解析标识进行操作。
ContentProvider中抽象方法具体的作用:
- public Boolean onCreate() ContentProvider创建时调用
- public int delete() 根据传入的Uri删除指定条件下的数据
- public Uri insert() 根据传入的Uri插入数据
- public Cursor query() 根据传入的Uri查询指定的数据
- public int update() 根据传入的Uri更新指定的数据。
点击数:16