Android 60问60答 (一篇复习整个Android)
# Android 60问60答 (一篇复习整个Android)
## 有哪些移动端平台?
厂商开发平台:
- los
- 黑莓(blackBerry)
第三方私有平台:第三方开发供移动设备厂商使用
- WindowsMobile
免费开源平台:
- Android
- Symbian
## Android中Linux内核的作用
- 充当用户和设备之间的接口。
- 管理所用活动内存和资源共享
- 充当设备上所安装的应用的主机
- 常由硬件制造商使用,因为它提供一个硬件抽象层,可在硬件发生变化时,确保上层保持不变
## Android使用的数据库是?
SQLite,提供可用于所有应用的功能强大的轻量级关系数据库
## Android有哪些构建块?
- 活动:专为一个清晰的目的提供独特的可视化UI
- 服务:始终在后台,完成特定的任务
- 内容提供者:存储和检索存储在文件、SQLite、web或任何其他持久化存储位置的数据
- 广播接收器:相应系统范围内广播通知的应用的组成部分
## Android项目的目录结构
- `/src/main/java`:项目使用的java源文件
- `/build`:编译后生成文件
- `libs`:专有库
- `/src/main/resourse`:应用资源文件,有
- Drawable:位图文件或者绘制对象资源类型的xml文件
- Mipmap:使用于不同启动器图标密度的可会址对象文件
- Layout:用于定义用户界面布局的XML文件
- Menu:定义应用菜单的XML文件
- Raw:需要以原始形式保存的任意文件
- Values:包括字符串、整数、颜色等简单值的xml文件
## 小部件的常用属性
| 属性名称 | 关联方法 | 描述 |
| ---------------------- | --------------- | ------------------------------ |
| android:layout_gravity | | 定义如何在布局容器内对齐小部件 |
| android_gravity | setGravity(int) | 设置对象在容器中的放置 |
| android:layout_weight | | 指定小部件的大小比例。如果不拉伸则设置为0,否则根据权重拉伸 |
### Android颜色表示
AARRGGBB
透明度|红|绿|蓝
## ListView小部件的作用
此小部件向用户显示一个列表,它与Java中的列表框组件类似,ListView默认支持垂直滚动。要想使用小部件,如下所示:
```xml
<ListView android:id="@id/listview"
android:layout_width="match_parent"
android:layoutheight="warp_content"
>
</ListView>
```
## ImageView小部件
用于显示图像,可以从其他资源(例如drawable目录、因特网、内容提供者)加载图像,它根据源图像的大小调整自己的尺寸。要想使用该小部件,如下:
```xml
<ImageView android:id="@id/imageview"
android:layout_width="match_parent"
android:layoutheight="warp_content"
android:src="@drawable/map"
>
</IamgeView>
```
## WebView小组件
用于显示网页,使用如下
```xml
<WebView android:id="@id/webview"
android:layout_width="match_parent"
android:layoutheight="warp_content"
>
</WebView>
```
要想加载网页需要在Java中调用:
```java
WebView view = (WebView)findViewById(R.id.webview);
view.loadUrl("https://google.com");
```
## Android布局有那些?
### 表格布局
此布局以行和列的形式排列其子视图。表格航对象创建可容纳小部件的行,表格布局的最大列数取决于用最大列数分割的行。
使用表格布局如下:
```xml
<TableLayout xmlns:android="略"
android:layout_height="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1"
>
<TableRow>
<TextView />
<TextView />
<TextView />
<!-- 这里有三个元素,故是三列 -->
</TableRow>
</TableLayout>
```
### 框架布局
以堆栈格式从上往下添加视图,项位置用`android:gravity`属性设置,布局的大小取决于最大视图的大小。
使用框架布局如下:
```xml
<FrameLayout xmlns:android:"略"
android:layout_height="fill_parent"
android:layout_height="fill_parent"
>
<ImageView />
<ImageView />
<ImageView />
<!-- 这里有三个元素,故是三行 -->
</FrameLayout>
```
## 使用那个方法来关联活动?
`setContentView()`方法用于将UI与活动关联,用法如下:
```java
public void onCreate(Bundle saveInstanceState){
super.onCreate(sabeInstanceState);
setContentView(R.layout.main);
}
```
## 如何注册活动为主活动?
只有在`manifest.xml`中注册过的活动才能被系统访问,要注册活动如下:
```xml
<manifest ...>
<application ...>
<activity android:name="..." />
</application>
</manifest>
```
activity标签中也可以添加一些属性,比如可以指定某活动为主活动:
```xml
<activity android:name=".mainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<categort android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
```
## 活动生命周期?
- 正在运行:活动对于用户是在屏幕上可见的
- 已暂停:焦点在另一个活动上,但是此活动依然可见
- 已停止;活动被另一个活动安全覆盖,且现处于后台中。停止的活动也是活动的,其对象依然保留在内存中
### 活动生命周期方法
- **onResume**:此方法在活动开始与用户交互之前调用。当活动位于栈顶且准备好接收用户输入就会调用。

## Intent的作用
意图(intent)是用于激活应用组件(活动、服务和广播接收器)的消息
## 如何使用显式intent启动活动?
显式Intent指定目标组件的名称以激活组件。
```java
Intent intent = new Intent(MyFirstActivity.this,MySecondActicity.class);
startActivity(intent);
```
## 如何使用隐式intent启动活动?
隐式intent用于激活其他应用中的组件,不通过名称指定目标组件。要使得隐式的intent生效,**需要为被调用的组件设置intent过滤器,`intent-filter`在`manifest.xml`中设置**。之后可以使用隐式intent表述action,Android会自动与现有组件的intent过滤器比较,找到合适的组件
```java
Intent intent = new Intent();
intent.setAction("com.anna.chapter6.a6");
intent.addCategory(Intent.CATEGORY_DEAFULT);
startActivity(intent);
```
## 如何使用Intent在组件之间传递数据
### 使用Intent
写入方:
```java
intent.putExtra("name","Nicole")
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
intent.putExtra("name", "Nicole");
intent.putExtra("age", 25);
intent.putExtra("address", "Shenzhen");
```
读取方:
```java
Intent intent = getIntent();
String nameString = intent.getStringExtra("name");
int age = intent.getIntExtra("age",0);
String addressString = intent.getStringExtra("address");
```
### 使用Bundle
写入方:
```java
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name", "Ben");
bundle.putInt("age", 28);
bundle.putString("address", "China");
intent.putExtras(bundle); //将bundle传入intent中。
```
读取方:
```java
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String nameString = bundle.getString("name");
int age = bundle.getInt("age");
String addressString = bundle.getString("address");
```
## ADB是什么
Android Debug Bridge(ADB)充当开发硬件与设备/仿真器之间的通信媒介
## ADB有哪些常用命令?
- device:生成已连接的设备列表
- pull:将指定文件从设备复制到计算机
- push:将指定文件从计算机复制到设备
- `install<path>`:在设备上安装应用(指定路径)
## Logcat有哪些日志级别?
- 错误,使用Log.e()记录
- 警告,使用Log.w()记录
- 信息,使用Log.i()记录
- 调试,使用Log.d()记录
- 详细信息,使用Log.v()记录
## 内部存储区与外部存储器的概念
设备内部的储存,以文件存储,属于应用私有
外部存储器存放在SD卡,所有应用与用户都可以访问
## 共享首选项是什么?
共享首选项是轻量级机制,用于存储基本数据类型的键值对,是快速存储默认值、类实例变量、用户界面状态以及用户偏好的理想方式
## 一个程序的数据库在哪?
`/data/data/<package name>/databases`
## 如何以编程的方式创建数据库?
在Android中,可以使用`android.database.sqlite.SQLiteDatabase`以编程方式创建数据库。SQLiteDatabase类公开各种方法来管理SQLite数据库。
## 操作数据库的方法有哪些?
- `openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory,DatabaseErrorHandler errorHandler)`
- `updata(String table,ContentValue values,String whereClause,String[] whereArgs)`
- `query(SQLiteDatabase db,String[] columns, String selection, Srtring[] selections,String groupby,String having,String sortOrder)`
- `getColumnIndex(String ColumnName)` 返回给的列名的基于0的索引,或1
- `getColumnName(int ColumnIndex)`
- `excute()` 如果不是SELECT、INSERT、DELETE或UPDATE,则执行SQL语句
## 如何检索受SQL语句影响的行数?
使用`excuteUpadataDelete()`或`excuteInsert()`方法
## 如何访问内容提供者公开的数据?
使用`android.content.ContentResolver`类
```java
ContentResolver resolver = getContentResolver();
```
## 如何读写内部存储区
**写文件**:
1. 使用`android.content.Context`类的`openFileOutput()`方法打开或创建文件
2. 使用`java.io.FileOutputStream`类的`write()`方法将数据写入文件
3. 使用`java.io.FileOutputStream`类的`close()`方法关闭文件
**读文件**
1. 使用`android.content.Context`类的`openFileOutput()`方法打开或创建文件
2. 使用`java.io.FileOutputStream`类的`read()`方法从文件读取数据
3. 使用`java.io.FileOutputStream`类的`close()`方法关闭文件
## getFIleDir与getDir的作用
- `getFileDir()`:获取用于保存的内部文件的文件系统目录的绝对路径
- `getDIr(String dirname,int node)`:在您的内部存储空间创建或打开一个现有目录,接收以下参数:
- dirname:要检索的文件夹名称
- mode:文件的创建模式
## 外部环境Enviroment的有哪些状态?
| 常量 | 描述 |
| ----------------------- | ------------ |
| MEDID_MOUNTED | 已经在加载,可以读写访问 |
| MEDID_REMOVED | 不存在 |
| MEDID_UNMOUNTED | 已存在但是没有加载 |
| MEDID_MOUNTED_READ_ONLY | 已存在但只读 |
##
`getExternalStorageDirectory(String type)`:检索外部存储目录
`getExternalStorageState()`:检索外部存储设备当前的状态,返回Environment中的某个常量
## 如何读写外部设备
需要使用`getExternalStorageDirectory`方法获取到外部存储的路径,然后读写过程与内部存储的读写方式相同
⚠️:写入之前需要在manifest文件中指定所需的权限
```xml
<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</user-permission>
```
## 如何检索公共首选项
需要使用`SharedPerferences`接口提供的方法
- `contains(String key)`:检查首选项是否包含特定首选项,参数指定要检查的key
- `getXXX(String key,XXX defValue)`:它从首选项中检索指定数据类型的值
## 如何获取网络权限
```xml
<user-permission android:name="android.permission.INTERNET">
</user-permission>
```
## 如何启动一个服务
可以使用`startService)`方法从引用组建启动服务
```java
Intent intent = new Intent(this,myService.class);
startService(intent);
```
## 启动的服务与绑定的服务的区别
### 启动的服务
启动的服务**生命周期**如下:
`onCreate()`--->`onStartCommand()`(`onStart()`方法已过时) ---> `onDestory()`
**特点**:
一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运行。
开启者**不能调用**服务里面的方法。
### 绑定的服务
绑定的服务生命周期如下:
`onCreate()` --->`onBind()`--->`onunbind()`--->`onDestory()`
**注意**:绑定服务不会调用`onstart()`或者`onstartcommand()`方法
**特点**:
bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。
绑定者可以调用服务里面的方法。
## 什么是广播接收器?
广播以intent的形式传达。要接收和响应广播,应用要包括一个称为广播接收器的组件。广播接收器不提供UI。不过,它可以创建状态栏通知,以在收到播时向用户发出提示
## 创建广播接收器要调用哪个方法?
- 创建一个类来拓展BroadcastReceiver类
- 在这个派生类中重写onReceive()方法
## 如何注册广播接收器?
以下两种方法都可以:
**在订单文件中配置**
```xml
<application ...>
<receiver android:name="./myReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<user-permission android:name="android.permisson.ACCESSS_NETWORK_STATE" />
</application>
```
**以动态的方式**
使用与主应用线程中的过滤器匹配的广播intent调用`registerReceiver`方法,这个方法的签名是:`public abstract Intent registerReceiver(BroadcastReceiver reveiver, IntentFilter filter)`
## 创建一个菜单资源要用哪些元素?
- `<menu>`:菜单资源的根结点
- `<item>`:用于创建菜单项
- `<group>`:是一个可选元素,允许对菜单项进行分类,从而允许共享属性
## 创建菜单要使用哪两个方法?
- 要重写`onCreateIotinsMenu()`方法
- 在这个方法中创建`android.view.MenuInflator`类的`expand`方法来拓展菜单
## ViewPage是什么?
可以使用AndroidX的ViewPage小部件创建滑动视窗
## 如何将主题引用到整个引用?
在manifest中将`android:thene`属性添加到application标签
## 自定义控件要拓展哪个类?
View
## setGravity怎么使用?
可以使用`setGravity(gavity,xOffset,yOffset)`方法将非常灵活地将消息条放在屏幕的任何位置
```java
Toast toast = Toast,makeText(...);
toast.setGravity(Gravity.BOTTOM|Gravity.LEFT,0,0);
toast.show();
```
## 设置闹铃到几种方法的区别?
- set:设置闹铃
- setRepeating:设置重复闹铃
- setInexactRepeating:按照定义的时间间隔重复闹铃,但如果设备处于休眠状态则不会唤醒,这样更省电,即不准确的重复闹铃。
## 常见的定位技术有哪四种?
- GPS
- WiFi定位
- IP地址定位
- 三角测量法
## 如何侦听传入的SMS
```java
Bundle bundle = intent.getExtras();
if(buddle!=null){
Object[] pdus = (Object[]) bundle.get("pdus);
SmsMessage[] messages = new SmsMessage[pdus.length];
for(int i=0;i<pdus.length;i++){
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i])
}
}
```
## 如何监听电话状态?
```java
String nameService = Content.TELEPHONE_SERVICE;
TelephonyManager teleManager = (TelephoneManager)getSystemService(nameService);
```
## Canvas与Paint的区别
Canvas(画布)表示可以绘制图形和图像的表面。提供了多种方法来绘制简单的图形、路径、位图和文本。
Paint(画笔)提供绘制富豪、文本和图形的样式和颜色的相关信息。
## 如何画一个圆?
```java
cavas.onDraw(){
// drawCircle(float cx,float cy,float radius,Paint paint);
cavas.drawCircle(50,50,30,paint);
}
```
## MediaPlayer的getCurrentPosition与setOnPerparedListener方法的作用
- `getCurrentPosition()`:返回当前播放的位置,单位毫秒
- `setOnPerparedListener(MediaPlayer.onPerparedListener listener)`:注册一个回调函数,当媒体源准备好播放时,可调用该函数
## 在哪里声明权限?
AndroidManifest.xml
## 如何运行时申请权限?
调用`checkSelfPermisson(String perm)`来检查权限,以保证用户没有把权限撤销
使用`requestPermissions(String permissions,int requestCode)`来请求权限,参数一是请求的权限,参数二随便给一个数字
## Android打包成什么?
.APK