Android 考试之葵花宝典-SPxiaomin著
祝大家考试顺利!!!能够帮助到大家,我感到非常地开心。隐约发现我自从上周总结完了之后,就没有好好的看过 Android 了,心中充满了恐惧,%><%,希望明天不要挂,我想静静了。
能够舍己为人,这也是一种非常好地品质。挂我一个,成就大家,(*^_^*) 嘻嘻……此生无憾,谁叫我是雷锋呢。
Android架构层次
- 4层:
- 应用程序层,
- 手机上的app。
- 应用程序框架层,
- 开发app用到的api接口。
- 核心类库,
- 系统库 & Android 运行环境。
- Linux内核。
- 提供硬件驱动。
- 应用程序层,
AndroidManifest.xml清单文件的主要内容
- 四大组件注册
- 权限声明
- 程序最低兼容的版本和最高版本
四大组件及其注册(重要)
-
Activity(管理Android应用程序的用户界面)
<activity android:name="cn.itcast.activitybasic.ActivityExample" android:label="ActivityExample"> <intent-filter> <action android:name="android.intent.action.MAIN"> // 表示将当前 Activity 设置为程序最先启动的 Activity。 <category android:name="android.intent.category.LAUNCHER"> // 表示让当前 Activity 在桌面上创建图标。 </intent-filter> </activity>
-
内容提供者(ContentProvider)(用于保存和检索数据)
<provider android:name="cn.itcast.db.PersonDBProvider" // 代表继承于 ContentProvider 类的全路径名称 android:authorities="cn.itcast.db.personprovider"> // 代表了访问本 provider 的路径 </provider>
-
广播接收者
// 注册常驻型广播 <receiver android:name="cn.itcast.MyBroadcastReceiver"> // 创建的广播接收者的全路径名; <intent-filter android:priority="20"> // 该广播的优先级 <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> // 注册非常驻型广播 MyBroadcastReceiver receiver = new MyBroadcastReceiver(); // 实例化过滤器并设置要过滤的广播 String action = "android.provider.Telephony.SMS_RECEIVED"; IntentFilter intentFilter = new IntentFilter(action); // 注册广播 registerReceiver(receiver, intentFilter);
-
服务(service) 长期在后台运行且不提供用户界面。
<service android:name="cn.itcast.startService.MyService" />
布局的xml文件及Java代码写法,setContentView, findViewById(重要)
-
RelativeLayout:
-
相对容器:
layout_align(ParentLeft|ParentTop|ParentRight|ParentBottom)
-
相对于控件:
layout_(toRightOf|toLeftOf|above|below)
layout_align(Baseline|Left|Right|Top|Bottom)
-
-
LinearLayout:
-
分为两种:水平线性布局 & 垂直线性布局。
-
使用方法:
<LinearLayout android:orientation="vertical 或者 horizontal"> </LinearLaout>
-
-
TableLayout:
<TableLayout> <TableRow> <Button android:layout_column="0" /> // 数值从0开始 </TableRow> </TableLayout>
-
GridLayout
<GridLayout android:columnCount="4" android:orientation="horizontal"> <Button android:layout_column="3" /> // 数值从0开始 <Button /> <Button android:layout_columnSpan="2" /> // or android:layout_rowSpan </GridLayout>
-
FrameLayout
-
AbsoluteLayout
<AbsoluteLayout> <Button android:layout_x="10dp" /> // or android:layout_y </AbsoluteLayout>
-
Java 代码写法
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
Activity创建及使用过程
简记法: 记不住虫(继、布、注、重)
- 定义一个类继承自
android.app.Activity
或者其子类; - 在
res/layout
目录中创建一个 xml 文件,用于创建Activity
的布局; - 在
AndroidManifest.xml
文件中注册Activity
; - 重写
Activity
的onCreate
方法,并在该方法中使用setContentView()
加载指定的布局文件。
弹出Toast的程序
Toast 组件有两个方法:
- makeText() : 用于设置要显示的字符串;
- show() :显示消息框;
```
Toast 变量名称 = Toast.makeText(Context, Text, Time);
变量名称.show();
// Context:表示应用程序环境的信息; 使用方法:"主程序类型.this",e.g. MainActivity.this
// Text:要显示的信息字符串;
// Time: 显示时长,Toast.LENGTH_LONG, Toast.LENGTH_SHORT
```
单击按钮,监听器的程序(三种)
- 创建内部类 ;
- 主类中实现 OnClickListener 接口;
- 匿名内部类;
6种常见的布局类型
- 相对
- 绝对
- 线性
- 表格
- 网格
- 帧
Intent跳转及传递参数
-
Activity跳转的程序
Intent intent = new Intent(this, Activity.class); startActivity(intent);
-
Activity跳转时传递参数的程序
// Activity01 String data = "Hello Acitvity02"; Intent intent = new Intent(this, Activity02.class); intent.putExtra("extra_data", data); startActivity(intent); // Activity02 Intent intent = getIntent(); String data = intent.getStringExtra("extra_data");
-
startActivity与startActivityForResult的区别
startActivityForResult
可以使用回传数据,然后startActivity
不可以。 -
new intent(如上示例代码);
-
intent.putExtra, getStringExtra, getIntExtra(如上示例代码);
-
显式意图与隐式意图
显示意图:在 Intent 启动 Activity 时,需要明确指定激活组件的名称。
隐式意图:在 Intent 启动 Activity 时,没有明确指定组件名。
SharedPreferences读写
-
读
SharedPreferences sp = context.getSharedPreferences(String name, int mode); // name 表示文件名 // mode 表示文件操作模式: 1. MODE_PRIVATE: 该SharedPreferences中的数据只能被 `本` 应用程序 `读写`。 2. MODE_APPEND: 该SharedPreferences中的数据可以被`追加`。 3. MODE_WORLD_READABLE: 该SharedPreferences中的数据可以被 `其它` 应用程序`读`。 4. MODE_WORLD_WRITEABLE: 该SharedPreferences中的数据可以被 `其它` 应用程序`读写`。 方法种类: 1. contains 判断是否包含 2. getAll 获取全部 3. get(Boolean|Int|Float|Long|String|StringSet) 获取值
-
写
SharedPreferences sp = context.getSharedPreferences(String name, int mode); Editor editor = sp.edit(); 获取此实例对象才可以进行编辑; editor.put(String|StringSet); 存入数据; editor.remove(); 删除数据; editor.clear(); 清空全部数据; editor.commit(); 提交修改;
SQLite数据库操作怎么做? SQLiteOpenHelper, SQLiteDatabase,Cursor各自的作用、方法
-
SQLiteOpenHelper
-
作用: 是一个抽象类,该类用于创建数据库和数据库版本更新。
-
方法:
- SQLiteOpenHelper 构造方法;
- onCreate 创建数据库时调用的方法;
- onUpgrade 数据库版本更新时调用;
- getReadableDatabase 创建或打开一个只读的数据库;
- getWritableDatabase 创建或打开一个读写的数据库;
-
-
SQLiteDatabase
-
作用: 是一个数据库访问类,该类封装了一系列数据库操作的API。
-
方法:
- insert 添加一条记录;
- query 查询数据;
- rawQuery 执行带占位符的 SQL 查询;
- update 修改特定查询;
- delete 删除表中特定记录;
- execSQL 执行一条带占位符的 SQL 语句;
- close 关闭数据库;
-
-
Cursor
-
作用: 是一个游标接口,在数据库操作中作为返回值,相当于结果集 ResultSet。
-
方法:
-
move:
- moveToNext 移动光标到下一行;
- moveToPrevious 移动光标到上一行;
- moveToFirst 移动光标到第一行;
- moveToLast 移动光标到最后一行;
- moveToPosition 移动光标到指定位置;
-
get:
- getInt 获取指定列的整型值;
- getString 获取指定列的字符串;
- getColumnIndex 得到指定列索引值;
- getCount 返回 Cursor 中的行数;
- getPostion 返回当前 Cursor 的位置;
- getColumnName 根据列的索引值获取列的名称;
- getColumnNames 获取 Cursor 所有列的名称的数组;
-
-
SQLite的特点
- 轻量级数据库;
- 遵守ACID关联式的数据库管理系统;
- 用文件保存数据,支持跨平台;
数据库开发流程
- 创建数据库;
- 增删查改数据;
常用控件怎么用?(EditText, TextView, Button,RadioButton,RadioGroup …….)代码怎么写
-
EditText
<EditText android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入您的用户名" android:textSize="14dp" /> EditText et_name = (EditText) findViewById(R.id.et_name); et_name.getText().toString().trim();
-
TextView
<TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用户名: " android:textSize="20dp" /> TextView tv_name = (TextView) findViewById(R.id.tv_name); tv_name.setText("用户名: SPxiaomin");
-
Button
<Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="提交用户信息" /> Button btn_send = (Button) findViewById(R.id.btn_send);
-
RadioGroup & RadioButton
<RadioGroup android:id="@+id/radioGroup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="性别" android:orientation="horizontal"> <RadioButton android:id="@+id/radioMale" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="男" /> <RadioButton android:id="@+id/radioFemale" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="女" /> </RadioGroup> RadioButton maleRadio = (RadioButton) findViewById(R.id.radioMale); maleRadio.isChecked();
ListView和Adapter
-
ListView: 一个以列表的形式展示具体数据内容的控件。
用人话说就是,类似于你手机qq中的联系人列表。
-
Adapter: 对 ListView 进行数据适配。
简单说,就是 ListView 只是一个空箱子,Adapter 用来往箱子里面装数据。
Log日志输出,级别
-
5个级别:
- Verbose:
Log.v();
- Debug:
Log.d();
- Info:
Log.i();
- Warning:
Log.w();
- Error:
Log.e();
- Verbose:
Activity生命周期7个方法
- onCreate(Bundle savedInstanceState):创建时执行。
- onStart(): 可见时执行。
- onRestart(): 回到前台,再次可见时执行。
- onResume(): 获取焦点时执行。
- onPause(): 失去焦点时执行。
- onStop(): 用户不可见进入后台时执行。
- onDestroy(): 销毁时执行。
Android中数据存储的5种方式
- 文件存储;
- SharedPreferences;
- SQLite 数据库;
- ContentProvider;
- 网络存储;
有序广播、无序广播、有序广播拦截、优先级
-
有序广播
- 同步执行;
- 同一时刻只会有一个广播接受器能够接受到这条信息,一个接一个的传送;
- 可以被拦截;
-
无序广播:
- 异步执行;
- 所有监听者几乎同一时刻收到这条广播;
- 无法被截断;
-
有序广播拦截
在有序广播中,高优先级的广播接收器先接受到广播,高优先级的广播接收器可以通过
abortBroadcast()
方法终止广播,进而低优先级的广播接收器就收不到广播。 -
优先级
- 在清单文件中注册广播接受者时定义
android:priority=""
,优先级的范围-1000~1000
之间; - 优先级相同,先注册的优先;
- 在清单文件中注册广播接受者时定义
服务的特点,及服务的启动
-
服务的特点:
- 与
Activity
类似,但是没有界面; - 即使用户切换到另一应用程序,服务仍可以在后台运行,因此经常被用来处理一些耗时的程序。
- 与
-
服务的启动
- start 方式启动服务: startService、stopService;
- bind 方式启动服务: bindService、unbindService;
start 方式和 bind 方式的区别:bind 方式启动服务的话,服务就可以和调用者进行方法调用和数据交互。
内容提供者,短信备份的例子
书本,p157
Android中的权限 (读通讯录、读短信、发短信、写文件、打电话、联网等)
在 AndroidManifest.xml
文件加上相应的权限配置就可以了
<uses-permission android:name="android.permission.READ_SMS" /> // 读取短信
Android的安全性
-
使用沙箱的概念来实现应用程序之间的分离和权限的限定;
-
应用程序签名;
- 识别代码的作者;
- 检测应用程序是否发生了改变;
- 在应用程序之间建立信任;
-
应用程序权限;
权限在安装期间通过 manifest 文件由应用程序请求,由用户授予或不授予。
-
文件和内容提供者权限。
附加内容
- APK、ADT、AVD、ADB 的全称
APK: android package,Android安装包;
ADT: android development tool,Android 开发工具;
AVD: android virtual device,android 虚拟设备;
ADB: android debug bridge,android 调试桥;
- Activity 生命周期,点击Back键时,Activity 依次经历了哪几个事件?点击 Home 键时,Activity 依次经历了哪几个事件?
点击 Back 键时,onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume;
点击 Home 键时,onPause -> onStop -> onRestart -> onStart -> onResume;
-
分别举例说明如何在 Java 代码和布局 XML 文件中访问存储在 strings.xml 文件中的字符串资源?如何实现国际化的应用程序?
-
示例如下:
```
// strings.xml
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<string name="hello">Hello!</string>
</resources>
// 布局 XML 文件中
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
// Java 代码中
String string = getString(R.string.hello);
```
-
由于 Android 采用 XML 文件来管理资源文件,因此 Android 程序国际化只需要为资源文件提供不同语言国家或地区对应的内容即可。
-
论述
-
android 平台的优缺点?
优点:
1. 开放性(允许任何移动终端厂商加入到 Android 联盟中来);
2. 挣脱运营商的束缚(能够更加方便的接入网络,运营商的制约减少);
3. 丰富的硬件选择(厂商众多);
4. 不受制约的开发商(app有好的和不好的,血腥、暴力等不在少数);
缺点:
1. 安全和隐私问题严重(个人痕迹等泄露严重);
2. 缺少标准;
- android vs ios
android 平台
优点:
1. 开发的优点使得其发展迅速,社区非常强大;
缺点:
1. 但是也是由于其开放性的原因,劣质软件如木马软件等数量不在少数,用户隐私被泄露严重;
ios 平台
优点
1. 非常好的用户体验;
2. 云服务强大,数据得以备份,并且具有追踪设备功能;
3. app 只能够到官方市场下载,使得应用安全可靠;
缺点
1. 封闭性带来的安全保障同时也造成了一定的不方便,比如说收费 app 等;
// 疑惑
ppt 图片插入,大小设置;