Android 第一行代码学习笔记
第一章 概述
1.1安卓系统架构
Android系统是基于Linux内核的,大致可以分为四层架构:Linux内核层、系统运行库层、应用框架层、应用层。
1.Linux内核层:为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、等
2.系统运行库层:通过一些C/C++库来为Android系统提供了主要的特性支持。同时这一层还有Android运行时库,主要提供了一些核心库,能够允许开发者使用Java语言编写Android应用。同时还包含了Dalvik虚拟机(5.0后改为ART运行环境,专门为移动设备定制的)
3.应用框架层:主要提供了构建应用程序时可能用到的各种API
4.应用层:所有安装再手机上的应用程序都是属于这一层
1.2Android四大组件
分别是活动、服务、广播接收器、内容提供器
1、活动:是所有Android应用程序的门面,应用中能看到的东西都是放在活动中的
2、服务:在后台运行,即使用户退出应用,服务仍然是可以继续运行
3、广播接收器:允许应用接收和发送广播消息
4、内容提供器实现:应用程序之间共享数据
1.3项目结构
- .gradle和.idea:都是AS自动生成的一些文件
- .app:项目中的代码与资源等内容几乎都放置在该目录
- build 包含编译时自动生成的文件
- gradle 包含了gradle wapper的配置文件
- .gitignore 将指定的目录或文件排除在版本控制之外
- build.gradle 项目全局的gradle构建脚本
- gradle.properties 全局的gradle配置文件
- gradlew和gradlew.bat 用于在命令行执行gradle命令
- ActivityTest .iml 标识此项目是IntelliJIDEA项目(AS基于此开发)
- local. properties 指定本机中Android SDK路径
- settings.gradle 指定项目中所有引入的模块
1.4app目录结构
1、build:类似于外层build目录,主要包含编译时自动生成的文件
2、libs:存放第三方jar包,会被自动添加到构建路径里面
3、androidTest:编写Android Test测试用例,可以对项目进行一些自动化测试
4、java:存放所有Java代码
5、res:项目中所有图片、布局、字符串等资源存放在此目录
6、AndroidMainfest.xml 整个Android项目的配置文件,程序中定义的四大组件都需要在这个文件里注册
7、test:用于编写Unit Test测试用例
8、.gitignore,将app模块内的制定目录排除在版本控制之外
9、.app.iml:IDEA自动生成的文件
10、build.gradle app模块的gradle构建脚本
11、proguard-rules.pro 用于制定项目代码的混淆规则
1.5 项目运行原理
AndroidMainfest.xml
```css
<activity
android:name=".FirstActivity"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />//以上两行表示FirstActivity是该项目的主活动
</intent-filter>
</activity>
FirstActivity.java
public class FirstActivity extends AppCompatActivity {
//活动创建时必定要执行的方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//引入布局
}
}
first_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 1"
/>
</LinearLayout>
1.6 res目录详解
1.res目录
drawable开头的文件夹用来存放图片;(如果只有一种分辨率图片,就存放在drawable-xxhdpi文件夹)
mipmap开头的文件夹用来存放应用图标;
values开头的文件夹用来存放字符串、样式、样色等配置
layout文件夹用来存放布局文件
如res/values/strings.xml文件
<resources>
<string name="app_name">ActivityTest</string>
</resources>
在代码中通过R.string.ActivityTest获得字符串的应用
在XML中通过@string/ActivityTest获得字符串的应用
1.7日志工具的使用
方法名称 | 对应级别 | 说明 | 快捷输入 |
---|---|---|---|
Log.v() | verbose | 意义最小的日志信息 | logv |
Log.d() | debug | 调试信息 | logd |
Log.i() | info | 重要的数据 | logi |
Log.w() | warn | 警告信息 | logw |
Log.e() | error | 程序中的错误信息 | loge |
方法中传入两个参数,第一个参数是tag(一般是当前类名),第二个参数是msg,打印具体的内容
tip:使用logt可以以当前类名生成一个TAG常量(为当前类的静态属性)
第二章 活动
2.1 创建基本活动
1.创建活动流程(附带一个简单的button)
创建活动文件->创建Layout文件->在AndroidMainFest注册(AS会自动注册)以及配置
FirstActivity.java对应修改部分
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);//创建按钮,参数为res中注册的id
button1.setOnClickListener(new View.OnClickListener() {
//注册button的监听器
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "You clicked Button 1",
Toast.LENGTH_SHORT).show();//makeText创建Toast对象,参数为context对象、显示的文本内容、显示的时长
}
});
}
first_layout.xml对应修改部分
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_1"
android:layout_width="match_parent" <!--当前元素和父元素一样宽-->
android:layout_height="wrap_content" <!--当前元素高度只要能刚好包含里面的内容-->
android:text="Button 1"<!--设置显示的文字内容-->
/>
</LinearLayout>
AndroidManifest.xml对应修改部分
<activity
android:name=".FirstActivity"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!--这两行代码配置主动活动-->
</intent-filter>
</activity>
2、创建带menu的活动
在res中创建menu文件夹,再创建main.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
item标签创建具体的菜单项,再指定标识符与名称
FirstActivity.java修改部分
@Override
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.main,menu);//getMenuInflater能创建MenuInflater对象和调用inflate方法为当前活动创建菜单,参数一表示通过哪一个资源文件创建菜单、参数二指定菜单项所要传入的Menu对象
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
//设置菜单响应事件
switch (item.getItemId()){
case R.id.add_item:
Toast.makeText(this,"you clicked add",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this,"you clicked remove", Toast.LENGTH_LONG).show();
break;
default:
}
return true;
}
tips:使用ctrl+o可以显示可覆盖的方法列表
2.2 使用Intent在活动之间跳转
2.2.1使用显示和隐式Intent
1.使用显示Intent
首先创建第二个活动,命名为SecondActivity
然后更改FirstActivity的覆盖方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
2.使用隐式Intent
修改AndroidManifest.xml
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY" />
</intent-filter