1. Android基础知识(第一行代码-第2版)
1.1 Android开发特色
1.1.1 系统架构
Linux内核层,系统运行库层,应用框架层,应用层
1.1.2 四大组件
活动Activity,服务Service,广播接收器Broadcast Receiver,内容提供器Content Provider
应用所看到的在活动中;服务一直运行,关闭应用也一直运行;广播接收信息如电话,短信(通知);内容提供器在应用程序之间共享数据
1.1.3 数据库
SQLite轻量级数据库,支持标准sql语法,也支持封装的api进行操作
1.2 Android项目文件结构
app壳项目内,AndroidManifest.xml所有的四大组件在这里声明,以及权限声明;
res放资源,图片,字符串,布局等。
1.2.1 AndroidManifest.xml
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.JavaTestWithLeetcode"
tools:targetApi="31" >
<!-- 定义主Activity -->
<activity android:name=".ui.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
主Activity:应用一打开启动的活动就是这个activity
Android程序设计讲究逻辑和视图分离,在布局文件中编写界面,在活动中引用:setContentView()在活动中引入布局
1.2.2 build.gradle
有两层,一个是最外层(module:project) 一个app目录(module:app)
1.2.2.1 module:project
apply from: "config.gradle"
buildscript {
repositories {
google()
mavenCentral()
maven {
url "http://maven.aliyun.com/nexus/content/groups/public/"
allowInsecureProtocol = true
}
}
dependencies {
classpath "com.android.tools.build:gradle:7.1.3"
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.41'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
注:不要将应用程序依赖项放在此处;他们属于在单个模块 build.gradle 文件中
-
buildscript
块中的repositories
用于构建脚本的依赖项,比如 Gradle 插件。 -
项目级的
repositories
用于项目实际依赖项的解析。 -
添加*maven仓库是为了使构建过程能够从指定地址中获取所需的依赖项,不是为了适配maven构建版本。
1.2.2.2 module:app
plugins {
alias(libs.plugins.android.application)
}
android {
namespace 'com.example.javatestwithleetcode'
compileSdk 34
defaultConfig {
applicationId "com.example.javatestwithleetcode"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation libs.appcompat
implementation libs.material
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
implementation 'com.google.android.material:material:1.7.0'
}
1.3 第一个Android项目
随机选择器
设计主要目的是对添加的选项进行随机选择,核心逻辑简单,即在数组中random一个下标,随机取那个下标的数组数;设计这个小需求主要是了解安卓的开发流程以及一些布局中的例如flowlayout和button等样式的深入理解。
1.整体先在layout中设计布局,在MainActivity中需要引用这个布局,setContentView(),注意:MainActivity需要在AndroidManifest.xml中注册
2.button需要使用android.widget.Button 否则背景颜色等会被影响
3.flowlayout流式布局,相当于整体和item
4.可以封装ToastUtil和LogUtil封装成工具类后直接使用
5.活动的生命周期,oncreate-->finish
private void addDataToFlowLayout(ArrayList<String> dataList) {
if(dataList.isEmpty()){
return;
}
flowLayout.removeAllViews();
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, 0, getResources().getDimensionPixelSize(R.dimen.margin_100), 0);
LayoutInflater inflater = LayoutInflater.from(this);
for (String data : dataList) {
View view = inflater.inflate(R.layout.item_flowlayout, flowLayout, false);
TextView textView = view.findViewById(R.id.textView);
textView.setText(data);
textView.setPadding(getResources().getDimensionPixelSize(R.dimen.margin_40), getResources().getDimensionPixelSize(R.dimen.margin_40)
, getResources().getDimensionPixelSize(R.dimen.margin_40), getResources().getDimensionPixelSize(R.dimen.margin_40));
textView.setSingleLine();
textView.setTextColor(getResources().getColor(R.color.white));
textView.setLayoutParams(layoutParams);
textView.setOnClickListener(v->{
ToastUtils.showToast(textView.getText().toString());
});
flowLayout.addView(view,layoutParams);
}
}
1.3.1 Intent
Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行 的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广 播等场景
1.Intent(Context packageContext, Class<?>
cls) 这个构造函数接收两个参数,第一个参数Context 要求提供一个启动活动的上下文,第二个参数Class 则是指定想要启动的目标活动
然后startActivity(intent)----显式intent
2.在AndroidManifest.xml的<activity>标签下面添加<intent-filter>内容,指定action和category,指明了这个activity可以响应的activity,category是附加信息,只有这两个同时匹配上才能响应Intent;每个Intent只能指定一个action但是多个category---隐式intent
隐式intent不仅可以启动自己程序内活动,还可以启动其他程序活动---->多个应用程序之间功能共享
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
如果有多个可选择的响应会跳出选择;可以通过schema指定当前活动能够响应的intent的协议
1.1.3.1 intent传递数据
//1.传递数据给下一个活动
intent.putExtra("extra_data",data);//键值对形式存放数据
Intent intent=getIntent();
String data =data.getStringExtra("extra_data");//取数据
//2.返回数据给上一个活动
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);//启动方式改变,请求码是唯一值,此处为1
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();//这里是SecondActivity,把返回值以键值对的形式放进去,然后给intent setResult,finish作用和back键一样
}
});
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();//如果SecondActivity是通过back按钮返回的,重写onBackPressed()
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnedData);//---活动被销毁后,回调上一个活动的onActivityResult()方法,通过重写这个方法获得返回的数据,这里是FirstAcitivity
}
break;
default:
}
}
1.3.2 活动的生命周期
Android使用任务Task管理活动,一个任务就是一组存放在返回栈Back Stack里的活动的集合
1.3.2.1 活动状态
状态名 | 特征 |
---|---|
运行状态 | 一个活动位于返回栈栈顶(最不愿意回收) |
暂停状态 | 不位于栈顶,但是可见(内存极低,才可能回收) |
停止状态 | 不位于栈顶,不可见(有可能会被回收) |
销毁状态 | 从返回栈中移除(倾向于回收) |
所以onCreate的参数Bundle savedInstanceState一般情况下是null 如果活动在被系统回收之前有通过onSaveInstanceState()这个方法保存数据,这个参数会带有之前保存的全部数据(键值对形式)
1.3.2.2 启动模式
standard,singleTop,singleTask,singleInstance
singleInstance原理
1.3.3 UI组件
button,textview,progressBar,AlertDialog等组件 具体细节不作赘述,布局大部分使用约束布局Constraintlayout。
android:visibility 指定控件的可见属性,visible--可见 invisible--不可见但是占据位置 gone--不可见且不占用原来的位置和大小
0dp是一种比较规范的写法,用于指定控件的大大小、间距等属性的单位
帧布局FrameLayout,没有方便的定位方式,所有控件都会默认摆放在布局的左上角
注:ListView是展示大量数据,需要将数据提供好,数组中的数据无法直接传递给ListView,所以需要适配器来完成例如ArrayAdapter,调用listview.setAdapter
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fruit_item, parent, false);