复习大纲
问答题
-
常用组件Button、ImageButton、ImageView、TextView和EditText的属性有哪些?并说明其作用是什么?(例如:EditText组件中,有hint属性,起到提示的作用。)
*号代表所有控件
组件 属性 作用 * android:layout_width 设置控件的宽度 * android:layout_height 设置控件的高度 * android:id 设置控件的ID * android:background 设置控件的背景 Button、TextView、EditText android:text 设置控件的文本 Button、TextView、EditText android:textSize 设置控件文本字体大小 Button、TextView、EditText android:textColor 设置控件的文本颜色 ImageButton、ImageView android:src 设置控件显示的图片资源 EditText android:inputType 设置编辑框的可输入内容 EditText android:hint 提示作用 -
Android软件框架结构自上而下可分为哪些层?每一层的主要功能是什么?(例如:钉钉或打开网页属于哪一层?)
应用程序层(Application)
:应用层为系统对用户所提供的应用程序。应用程序框架层(Application Framework)
:这一层是核心应用程序所使用的API框架,为应用层提供各种接口API,包括各种组件和服务来支持我们的安卓开发。各种库(Libraries)和Android运行环境(RunTime)
:提供应用程序框架层所需要的系统级实现。操作系统层(OS)
:提供操作系统的本质功能:文件管理、内存管理、进程管理、网络协议栈等。
-
Android应用程序的四大组件是什么?主要功能是什么?
Activity
:为用户提供可视化界面及操作Intent
:是程序中各个组件进行数据传递和动作执行的一种方式Content Provider
:是所有应用程序之间数据共享的一个桥梁Service
:Service是一个长期运行在后台且没有用户界面的组件。
-
如何区分
Android Studio
中的Project
和Module
?在使用
Android Studio(以下简称AS)
新建项目时都会有这样一个概念:
Eclipse中的WorkSpace
相当于AS中的Project
;
Eclipse中的Project
相当于AS中的Module
(只就新建而言)。所以Eclipse中在一个WorkSpace中建立多个Project等同于在AS的Project中建立多个Module。
-
Android项目中各个文件夹和文件的含义和用途是什么?
项目结构及其作用如图所示:
application --->项目的根目录,存放项目的所有代码和配置文件 └── src --->项目的所有文件目录,存放项目的代码和资源文件 └── main --->项目的所有文件目录,存放项目的代码和资源文件 ├── AndroidManifest.xml --->项目的清单文件,用于配置各个组件或者是一些访问权限等 ├── java --->java类存放目录 │ └── cn --->Java包目录 └── res --->可以存放项目中所有的资源文件,例如:布局、图片(*.png、*.jpg)、文本等 ├── drawable --->存放项目中的图片资源文件 ├── layout --->存放项目中的布局资源文件 └── values --->存放一些资源文件的信息,用于读取文本资源 9 directories, 6 files
文件(夹) 作用 \src 项目的所有文件目录,存放项目的代码和资源文件 \src\main 项目的所有文件目录,存放项目的代码和资源文件 \src\main\AndroidManifest.xml 项目的清单文件,用于配置各个组件或者是一些访问权限等 \src\main\java java类存放目录 \src\main\res 可以存放项目中所有的资源文件,例如:布局、图片(.png、.jpg)、文本等 \src\main\res\drawable 存放项目中的图片资源文件 \src\main\res\layout 存放项目中的布局资源文件 \src\main\res\values 存放一些资源文件的信息,用于读取文本资源 -
Android布局有哪些?结合教学PPT,分别对相对布局、线性布局和帧布局做练习。
LinearLayout(线性布局)
TableLayout(表格布局)
RelativeLayout(相对布局)
FrameLayout(帧布局)
AbsoluteLayout(绝对布局)
-
Intent有哪些重要属性,Activity之间是如何进行信息的传递的?
属性: Component(组件)、Action(动作)、Data(数据)、Category(分类)、Type(类型)、Extra(扩展信息)。
在Android中是通过intent中的属性进行信息的传递的. -
简述Activity的四种状态以及不同状态使用的方法。
Running(活动)状态
:一个新的Activity启动入栈后,显示在屏幕最前端,它是可见的、有焦点的,并且可与用户进行互,此时的Activity即处于Running状态。Paused(暂停)状态
:Activity可见但不拥有焦点(当然也不可与用户交互),此时的Activity即处于Paused状态。Stopped(停止)状态
:当Activity不可见时,它就处于Stopped状态。这时Activity仍然留在内存里并保存所有的状态和成员信息。一旦Activity退出或关闭,当前的状态和成员信息就丢失了。Killed(销毁)状态
:Activity从堆栈中被移除后,即处于Killed状态,需要重新启动,然后才可以再次使用这个Activity。
-
简要说明Service的几种启动方式及其特点。
startService方式
:Service可无限期的运行。bindService方式
:Service会随绑定的Activity结束时一起停止
-
简述几种Android数据存储的方法和特点,并说明每一种数据存储方法的步骤、使用的语法、创建过程等。
-
文件存储
:文件存储方式是一种较常用的方法,在Android
中读取/写入文件
的方法,与Java中实现I/O的程序是完全一样的,使用步骤:-
通过文件名和写入模式创建输出流对象
FileOutputStream outputStream = openFileOutput(FILE_NAME, MODE_APPEND);
-
通过文件输出流将要写入的内容写入文件
outputStream.write(txt_write.getText().toString().getBytes());
-
最后关闭输出流
outputStream.close();
-
-
SQLite数据库
:SQLite
是Android
所集成的一个轻量级的嵌入式数据库
,它不仅可以使用Andorid API
操作,同时它也支持SQL语句
进行增删改查等操作,使用步骤:-
编写一个类继承
SQLiteOpenHelper
,用于初始化数据库和建表等操作public class StudentDBHelper extends SQLiteOpenHelper { public StudentDBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { // 执行建表语句 String sql = "create table t_student(stuNo TEXT primary key ,stuName TEXT);"; sqLiteDatabase.execSQL(sql); Log.i("student.db", "数据库创建成功!"); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }
-
使用上一步我们创建的
StudentDBHelper
来实例化一个数据库对象StudentDBHelper studentDBHelper = new StudentDBHelper(MainActivity.this, dbName, null, 1); SQLiteDatabase db = studentDBHelper.getReadableDatabase();
-
使用创建出的数据库对象进行数据库的增删改查操作
// 组装键值对 ContentValues contentValues = new ContentValues(); contentValues.put("stuNo", stuNo); contentValues.put("stuName", stuName); // 进行插入,三个参数分别为 要插入的表名 若数据为空时 设置为null的那一列 键值对数据,返回受影响条数,返回1则插入成功 long result = db.insert(tableName, "stuName", contentValues);
-
-
SharedPreferences
:SharedPreferences
是Android提供
的用于存储一些简单配置信息的一种机制,采用了XML格式
将数据存储到设备中。使用步骤:-
通过
SharedPreferences
名称和模式ID
来获取SharedPreferences
实例对象SharedPreferences preferences = getSharedPreferences("PREFS_NAME", MODE_PRIVATE);
-
通过实例的
edit()
方法获取编辑器对象SharedPreferences.Editor edit = preferences.edit();
-
向编辑器对象中添加数据
edit.putString("stringName","stringValue");
-
调用编辑器对象的
commit()
或apply()
方法提交数据,完成数据的存储edit.commit(); edit.apply();
-
-
AndroidManifests.xml
文件的作用是什么?其中常见的属性有哪些?分析如何添加第二个Activity的注册信息、Service的注册信息和广播接收器的注册信息。-
作用:项目的清单文件,用于配置各个组件或者是一些访问权限等
-
常见属性
android:icon
:配置应用的图标android:label
:配置应用名android:theme
:配置应用的主题样式
-
注册Activity
<activity android:name=".SecondActivity" -----Activity的类路径 android:enabled="true" -----是否可实例化 android:exported="true" > -----是否可导出 </activity>
-
注册Service
<service android:name=".MusicService" -----Service的类路径 android:enabled="true" -----是否可实例化 android:exported="true" > -----是否可导出 </service>
-
注册广播接收器
<receiver android:name=".Receiver" -----BroadcastReceiver的类路径 android:enabled="true" -----是否可实例化 android:exported="true"> -----是否可导出 <intent-filter> <action android:name="action" /> -----配置接收器监听的动作 </intent-filter> </receiver>
-
编程练习题
设计一个QQ登录界面,并实现以下功能:
- 点击“登录”按钮,可以跳转到另一个界面。
- 第二个界面,添加“文本框”组件,写上自己的学号信息。
- 在第二个界面,添加一个“退出”按钮,点击“退出”按钮,使其切换到首界面。
项目目录及文件如下
➜ login tree
.
└── src
└── main
├── AndroidManifest.xml ---->项目清单文件
├── java
│ └── cn
│ └── lddcc
│ └── study
│ └── test
│ └── login
│ ├── MainActivity.java --->主页面类
│ └── SecondActivity.java --->第二个页面类
└── res
└── layout
├── activity_main.xml --->主页面布局文件
└── activity_second.xml --->第二个页面布局文件
10 directories, 5 files
AndroidManifest.xml 项目的清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lddcc.study.test.login">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HomeWork">
<activity
android:name=".SecondActivity"
android:exported="true" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity.java 主页面Java文件
package cn.lddcc.study.test.login;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 给登录按钮添加事件
findViewById(R.id.btn_login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 实例化一个Intent对象用于跳转到第二个页面
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
// 进行跳转
startActivity(intent);
}
});
}
}
SecondActivity.java 第二个页面Java文件
package cn.lddcc.study.test.login;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 给退出按钮添加单击事件
findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 结束当前页面,若主页面未关闭,则会回退到主页面,即登录页
SecondActivity.this.finish();
}
});
}
}
activity_main.xml 主页面的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center|top"
android:orientation="vertical"
android:padding="20dp"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="75dp"
android:orientation="horizontal">
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="用户名"
android:textSize="15sp" />
<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="请输入用户名"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="horizontal">
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="密码"
android:textSize="15sp" />
<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:inputType="textPassword"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:gravity="center"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:text="注册" />
<Button
android:id="@+id/btn_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:text="登录" />
</LinearLayout>
</LinearLayout>
activity_second.xml 第二个页面的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".SecondActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="210809010XXXX"
android:textSize="20sp" />
<Button
android:id="@+id/btn_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="退出" />
</LinearLayout>
运行图如下
设计一个“网易云”主界面,并实现以下功能;
- 添加“播放器”按钮
- 设置启动主界面,音乐即时响起
- 点击“播放器”按钮,关闭或启动音乐。
项目的目录如下
➜ music tree
.
└── src
└── main
├── AndroidManifest.xml --->项目清单文件
├── java
│ └── cn
│ └── lddcc
│ └── study
│ └── test
│ └── music
│ ├── MainActivity.java --->主页面类
│ └── MusicService.java --->音乐服务类
└── res
├── layout
│ └── activity_main.xml --->主页面布局文件
└── raw
└── music.mp3 --->音乐文件
11 directories, 5 files
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lddcc.study.test.music">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HomeWork">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MusicService" android:enabled="true" android:exported="false"/>
</application>
</manifest>
MainActivity.java
package cn.lddcc.study.test.music;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageButton;
public class MainActivity extends AppCompatActivity {
// 定义服务的Intent
Intent serviceIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 实例化服务Intent对象
serviceIntent = new Intent(MainActivity.this, MusicService.class);
// 给播放器按钮添加单击事件
findViewById(R.id.btn_play).setOnClickListener(v -> {
// 若当前播放状态为false,则播放音乐;若为true,则停止播放
if (!MusicService.isPlay) {
// 通过开启服务来播放音乐
startService(serviceIntent);
} else {
// 通过关闭服务来停止音乐
stopService(serviceIntent);//停止Service
}
});
}
@Override
protected void onStart() {
// 当应用启东市就播放音乐
startService(serviceIntent);
super.onStart();
}
}
MusicService.java
package cn.lddcc.study.test.music;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
// 创建音乐服务类
public class MusicService extends Service {
// 定义公共静态变量标识是否播放状态
public static boolean isPlay;
// 定义播放器
private MediaPlayer player;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
// 服务被创建时,创建MediaPlayer对象,并加载播放的音频文件
player = MediaPlayer.create(this, R.raw.music);
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 服务开始时,若当前状态为未播放,则播放音乐,isPlay默认为false
if (!player.isPlaying()) {
player.start();// 播放音乐
isPlay = player.isPlaying();//设置当前状态为正在播放
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// 停止音乐的播放
player.stop();
// 当前的状态为停止播放
isPlay = player.isPlaying();
// 释放资源
player.release();
super.onDestroy();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放器" />
</LinearLayout>
运行图如下