Linux内核层,还包括各种底层驱动,如相机驱动、电源驱动等
系统运行库层,包含一些c/c++的库,如浏览器内核webkit、SQLlite、3D绘图openGL、用于java运行针对移动设备定制的dalvik、ART虚拟机等
应用框架层,包含安卓的一些api
应用层 我们写的程序在此
活动 你看得到的都叫活动
服务 后台功能
广播接收器 接收通知
内容提供器 应用之间共享数据,如通讯录
JDK
AndriodSDK
AndriodStudio
打开andriod studio
左上角 new project
选择add empty activity(而非no activity) 名字就默认的MainActivity即可
包名要有唯一性,名字设置为helloworld,不勾选use lagacy选项
左上角换成project,这是项目的真实结构, 默认的andriod适合老手快速开发使用
编译、哪个app(app是当前的主项目)、用哪个设备模拟、运行
正常情况 我们只需要关注app目录即可。
ps,安卓使用gradle构建
libs是你引入的外部jar包
src是我们自己的代码存放的地方。
andriodTest和tesr是编写测试用例的地方,目前用不到,无需关注
proguard-rules 用于定义代码的混淆规则,当我们发布不想让别人知道我们源代码的时候使用
main目录是我们真正写代码的地方,java就是我们写java代码的目录,res是资源文件,drable是图片,layout是布局,values是字符串,mipmapyo用来放图标的,xxxdpi的后缀是各种分辨率的。最后哪个AndriodManifest.xml用于注册各种组件,各种我们用到的东西 都要在这里声明。
系统自动帮我们生成了这些代码 我们不需要记 只要关注 onCreate里面的方法就行了
package com.example.helloworld;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
//AppCompatActivity是一种向下兼容的活动
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) { //oncreate是活动被创建的时候要调用的方法
super.onCreate(savedInstanceState); //构造器
//以上的代码块都是固定写法 不用管 下面是我们的代码逻辑
setContentView(R.layout.activity_main); //设置布局文件 安卓讲究视图分离 这个R代表res文件夹 后面的是文件路径
}
}
activity_main.xml
这个是安卓的视图层,默认是图形化编辑器,我们点击code变成代码编辑模式
先不用管textview上面的部分,这部分都会帮我们自动生成,我们关注下面的部分即可。由于安卓很智能 当我们输入helloWorld的时候,它自动帮我们生成了一个textview 里面的text就是它的名字。
AndriodManifest.xml打开发现下面自动生成的文件
运行
选择模拟器后,自动安装运行。
我们把之前视图文件中TextView的替换成这个
我们加了歌 linerLayout ,之后会进一步介绍 这里只用记住就行了
当我们在xml中 定义一个id 的时候 用@+id/button1这种语法
当我们想要使用一个id的时候 就去掉加号用@+id/button1z这种语法
之后打开java文件,在设置视图文件的后面 加上
......
setContentView(R.layout.first_layout) ;
//找到视图层中的button
Button button1= (Button)findViewById(R.id.button1); //这里的id就不是文件路径了 安装会把res中的属性都虚拟化出来
//compileSdkVersion >=26,findViewById 前的强制类型转换是多余的 所以 (Button)可以不用写了
//设置点击监听器,当被点击的时候 执行被点击的方法 由于java一切都是对象 不能只传入一个函数 所有要传入一个匿名内部类
button1.setOnClickListener(new View.OnClickListener(){ //注意这里的On的O是大写== 因为这是一个接口
@Override
public void onClick(View v){
//第一个参数是Context 上下文
Toast.makeText(MainActivity.this, "Hello World", Toast.LENGTH_SHORT).show();//活动本身就是一个Context
}
});
}
事实上,可以用Lambda表达式 简写
button1.setOnClickListener(v -> {
//第一个参数是Context 上下文
Toast.makeText(MainActivity.this, "Hello World!", Toast.LENGTH_SHORT).show();//活动本身就是一个Context
});
自动导入包
发现报错无法运行 说找不到Button 这是因为我们没有import Button toast的包
可以设置 自动导入
1,在res目录下 新建一个menu文件夹,再新建一个新的xml文件,在里面写menu的布局
2,回到MainActivity 然后重写OnCreateOptionsMenu方法,设置现实menu。重写方法可以用Ctrl+O快捷键
3,重写onOptionsItemSelected方法,在里面写逻辑。
详细看书 不难
intentintent用于各组件的交互,可用于启动其他活动、启动服务、发送广播等场景
显式intent1,新建一个FirstActivity 作为主活动,新建一个按钮
2,新建一个SecondActivity 做为次活动,不需要配置intent参数
3,重写方法
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
});
}
.this代表对这个类实例的应用
.class代表对其他类实例的引用
class.this 和.class 是等价的
用log 而非java的 syso 更方便 而且有快捷键
详细看书
安卓使用的时候 会自动引入 res中的文件????



