一行代码-安卓 第一章 概述

1.1安卓系统架构

  1. 2003年 Andy Rubin 创办Android公司–> 2005谷歌收购–>抄袭ios–>Linux内核–>甲骨文java–>70%操作系统份额
  2. Linux内核–>系统运行层–>应用框架层–>应用层
    1. Linux内核—>Android 系统是基于 Linux 2.6 内核的,这一层为 Android 设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi 驱动、电源管理等。
    2. 系统运行层–>这一层通过一些 C/C++库来为 Android 系统提供了主要的特性支持。如 SQLite库提供了数据库的支持,OpenGL|ES 库提供了 3D 绘图的支持,Webkit 库提供了浏览器内核的支持等。
      同样在这一层还有 Android 运行时库,它主要提供了一些核心库,能够允许开发者使用 Java 语言来编写 Android 应用。另外 Android 运行时库中还包含了 Dalvik 虚拟机,它使得每一个 Android 应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik 虚拟机实例。相较于 Java 虚拟机,Dalvik 是专门为移动设备定制的,它针对手机内存、CPU 性能有限等情况做了优化处理
    3. 应用框架层–>这一层主要提供了构建应用程序时可能用到的各种 API,Android 自带的一些核心应用是使用这些 API 完成的,开发者也可以通过使用这些 API 来构建自己的应用程序。
    4. 应用层–>app
      在这里插入图片描述

1.2Android四大组件

分别是活动、服务、广播接收器、内容提供器

  1. 活动:是所有Android应用程序的门面,应用中能看到的东西都是放在活动中的
  2. 服务:在后台运行,即使用户退出应用,服务仍然是可以继续运行
  3. 广播接收器:允许应用接收和发送广播消息
  4. 内容提供器实现:应用程序之间共享数据

1.3项目结构

章节连接: https://weread.qq.com/web/reader/7c532360718ff6317c5255dkaab325601eaab3238922e53
在这里插入图片描述

  1. gradle和.idea:都是AS自动生成的一些文件
  2. app:项目中的代码与资源等内容几乎都放置在该目录
  3. build 包含编译时自动生成的文件
  4. gradle 包含了gradle wapper的配置文件
  5. gitignore 将指定的目录或文件排除在版本控制之外
  6. build.gradle 项目全局的gradle构建脚本
  7. gradle.properties 全局的gradle配置文件
  8. gradlew和gradlew.bat 用于在命令行执行gradle命令
  9. ActivityTest .iml 标识此项目是IntelliJIDEA项目(AS基于此开发)
  10. local. properties 指定本机中Android SDK路径
  11. settings.gradle 指定项目中所有引入的模块

1.4app目录结构

在这里插入图片描述

  1. build ,这个目录和外层的build目录类似,主要也是包含了一些在编译时自动生成的文件,不过它里面的内容会更加更杂,我们不需要过多关心。
  2. libs,如果你的项目中使用到了第三方jar包,就需要把这些jar包都放在libs目录下,放在这个目录下的jar包都会被自动添加到构建路径里去。
  3. androidTest ,此处是用来编写Android Test测试用例的,可以对项目进行一些自动化测试。
  4. java,目录是放置我们所有Java代码的地方
  5. res这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下,所以你不用担心会把整个res目录弄得乱糟糟的。
  6. AndroidManifest.xml这是你整个Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明
  7. proguard-rules.pro这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读。

1.5 项目运行原理

  1. 首先在AndroidManifest.xml中注册活动, <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />这两句表示这个活动是主活动,最先启动这个活动

     	<activity
             android:name=".MainActivity"
             android:exported="true"
             android:label="@string/app_name"
             android:theme="@style/Theme.HelloWorld.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
    
  2. 从mainactivity可以看出 它继承AppCompatActivity,这是一个活动基类,活动中还有一个onCreate()方法,这是一个活动创建时必须执行的方法

     public class MainActivity extends AppCompatActivity {
    
     private AppBarConfiguration appBarConfiguration;
     private ActivityMainBinding binding;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
    
         binding = ActivityMainBinding.inflate(getLayoutInflater());
         setContentView(binding.getRoot());// 这个函数引进布局
    
         setSupportActionBar(binding.toolbar);
    
         NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
         appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
         NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
    
         binding.fab.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                 Snackbar.make(view, "Replace with your own action尼玛的", Snackbar.LENGTH_LONG)
                         .setAction("Action121", null).show();
             }
         });
     }
     其实Android程序的设计讲究逻辑和视图分离,因此是不推荐在活动中直接编写界面的,
     更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。
     布局文件写在res目录下的layout文件下
    

1.6 res目录详解

在这里插入图片描述

  1. 所有以drawable开头的文件夹都是用来放图片的,

  2. 所有以mipmap开头的文件夹都是用来放应用图标的,

  3. 所有以values开头的文件夹都是用来放字符串、样式、颜色等配置的,

  4. layout文件夹是用来放布局文件的。

  5. res/values/strings.xml文件,内容如下

     <resources>
         <string name="app_name">HelloWorld</string>
         <string name="action_settings">Settings</string>
         <!-- Strings used for fragments for navigation -->
         <string name="first_fragment_label">First Fragment</string>
         <string name="second_fragment_label">Second Fragment</string>
         <string name="next">Next</string>
         <string name="previous">Previous</string>
     
         <string name="hello_first_fragment">Hello first fragment</string>
         <string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
     </resources>
    

    可以看到,这里定义了一个应用程序名的字符串,我们有以下两种方式来引用它。在代码中通过R.string.app_name可以获得该字符串的引用。在XML中通过@string/app_name可以获得该字符串的引用。

1.7 详解build.gradle文件

  1. 不同于Eclipse, Android Studio是采用Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于XML(如Ant和Maven)的各种烦琐配置。

  2. 项目中有两个build.gradle文件,一个外层,一个在内层,最新版安卓有改动,gradle文件被专门放置在Gradle Scripts文件夹下,两个build.gradle文件分别用于项目和模块
    在这里插入图片描述

  3. 先看用于项目的build.gradle,

     		// Top-level build file where you can add configuration options common to all sub-projects/modules.
     		plugins {
     			    id 'com.android.application' version '7.1.3' apply false
     			    id 'com.android.library' version '7.1.3' apply false
     			}
     			// 插件
     		task clean(type: Delete) {
     		    delete rootProject.buildDir
     		}
    
  4. 再看用于模块的build.gradle

     plugins {
         id 'com.android.application'
     }
     
     android {
         compileSdk 32
     
         defaultConfig {
             applicationId "com.example"   // 项目包名
             minSdk 29    //  最低兼容版本
             targetSdk 32   // 目标版本
             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
         }
         buildFeatures {
             viewBinding true
         }
     }
     
     dependencies {
     
         implementation 'androidx.appcompat:appcompat:1.3.0'
         implementation 'com.google.android.material:material:1.4.0'
         implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
         implementation 'androidx.navigation:navigation-fragment:2.3.5'
         implementation 'androidx.navigation:navigation-ui:2.3.5'
         testImplementation 'junit:junit:4.13.2'
         androidTestImplementation 'androidx.test.ext:junit:1.1.3'
         androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
     }
    

1.8 日志工具的使用

  1. Android中的日志工具类是Log(android.util.Log),这个类中提供了如下5个方法来供我们打印日志。
  2. Log.v()。用于打印那些最为琐碎的、意义最小的日志信息。对应级别verbose,是Android日志里面级别最低的一种。
  3. Log.d()。用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。对应级别debug,比verbose高一级。
  4. Log.i()。用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以帮你分析用户行为数据。对应级别info,比debug高一级。
  5. Log.w()。用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。对应级别warn,比info高一级。
  6. Log.e()。用于打印程序中的错误信息,比如程序进入到了catch语句当中。当有错误信息打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。对应级别error,比warn高一级。
  7. Log.d()方法中传入了两个参数:第一个参数是tag,一般传入当前的类名就好,主要用于对打印信息进行过滤;第二个参数是msg,即想要打印的具体的内容。
  8. 快捷输入,输入logd,然后输入tab键自动补齐
  9. 日志过滤器,可以过滤级别和名称

1.9 Android Studio 安装

书参考:https://weread.qq.com/web/reader/7c532360718ff6317c5255dkc51323901dc51ce410c121b
添加代理,vpn的代理服务器填上去
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值