精华内容
下载资源
问答
  • 还记得在《第二行代码》出版的时候,我也给大家送了一些书。不知道有没有同学记得,那会是 16 年 12 月,也是我毕业那一年,刚来北京工作半年。...从第三行代码上市之后,我就在等货源充足,这样除了大家可以抽取...

    还记得在《第二行代码》出版的时候,我也给大家送了一些书。

    不知道有没有同学记得,那会是 16 年 12 月,也是我毕业那一年,刚来北京工作半年。

    这几年我和郭神依然保持着足够的吹逼时间,我们俩都朝着自己的一些小目标去奋斗,也都发布了一些自己的小玩意,在郭神的身上我也学到了很多。

    当然了,这几年也是我个人技术以及综合能力成长最快的几年。

    从第三行代码上市之后,我就在等货源充足,这样除了大家可以抽取图书以外,也有途径可以购买,也算是我对郭神的一些支持。

    郭神是个很有意思的人,他在没准备好的时候,我们偶尔也会督促他,是时候写第三行代码了,他一般回复都是:

    郭:我写个毛线,Kotlin 我还没学会呢。

    然后,过了段时间:

    第三行代码要上市了...

    这几天我们又在说,是时候写第四行代码 Flutter 版本了。

    郭:我写个毛线,Flutter 我还没学会呢。

    当然在有前两本书的基础上,这本书还是耗费了郭神相当的精力,毕竟想通俗的去讲一门新的语言是很不容易的,需要有足够的内容设计以及编排能力,让这些内容要能够递进的表达出 Kotlin 所有重要的特性。

    好了,吹的差不多了。

    这次郭神给了我 10 本,签名版

    我又厚着脸皮去找了出版社要了10 本样书,没错,确实是厚着脸皮,因为正常情况郭神找我了,出版社是可以不理我的...

    所以这次一共 20 本书,其中 10 本签名版,10 本样书,样书有个章:

    第二版的时候是这样的:

    279bd5bc74e4da6cad5ef11cef5ff366.png都可以认为是限量版,除了学习之外还是比较有纪念意义的。我是这么分配 20 本书的,1 本签名版留给了小缘,1 本签名版送给自己。小程序抽取 15 本,人人可参与,签名版随机发出。

    64d3b6534cdda73d20404692be26d7d3.png

    还有 3 本,我会今天的留言中,前三位我发现总留言次数超过   100 次的同学,我就直接选中你啦,也算是对你长期支持的感谢。最后,五一小长假也是非常适合学习的,你也可以选择直接购买此书,点击小程序即可在京东购买:好了,拜了个拜,祝大家好运!

    124ec46b2b5c57798af0985a9ae4b24b.png

    扫一扫 关注我的公众号

    如果你想要跟大家分享你的文章,欢迎投稿~

    展开全文
  • 第一行代码(第三版)第三章总结 1. Activity 1.1 Activity概念 Activity为安卓四大组件之一(Activity/Service/BroadCast Recevicer/Content provider)。Activity主要负责与用户交互,提供一个显示的屏幕。 1.2 创建...

    第一行代码(第三版)第三章总结

    1. Activity

    1.1 Activity概念

    Activity为安卓四大组件之一(Activity/Service/BroadCast Recevicer/Content provider)。Activity主要负责与用户交互,提供一个显示的屏幕。

    1.2 创建Activity

    1. 新建类MainActivity继承Activity基类。
    public class MainActivity extends AppCompatActivity
    {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            //...
        }
    }
    

    代码中继承的AppCompatActivity类与Activity类的区别在于,AppCompatActivity类对很多控件做了向下兼容参考博客1

    1. AndroidManifest.xml文件中注册该Activity。
    <activity
    android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    

    intent-filter用于过滤Intent的属性,匹配成功才能启动该Activity参考博客2个人认为上面代码中的action和category内的信息的意义相当于表示启动该APP的时候会发出启动命令(包含这两条相同的action和catergory),过滤后即匹配上了MainActivity类,将该类当做启动的Activity初始化。

    1.3 销毁Activity

    1. 按下Back返回键即可销毁当前的Activity。
    2. 调用Activity的finish()即可销毁当前的Activity。

    1.4 Activity生命周期

    1.4.1 返回栈

    一个app可能有多个Activity,新的Activity会覆盖在旧的Activity上,而Activity使用栈(后进先出)来存储多个Activity。

    1.4.2 Activity状态

    每个Activity在其生命周期内最多会有4种状态:

    1.运行状态

    当一个Activity处于栈顶的时候,就是运行状态。

    2.暂停状态

    当一个Activity不处于栈顶,但是属于可见的状态(别的Activity部分遮挡了该Activity),就进入了暂停状态。

    3.停止状态

    当一个Activity不处于栈顶,并且完全不可见的时候,就进入了停止状态,系统会为其保留状态和变量,但是当内存不足的时候随时会被系统回收。

    4.销毁状态

    当一个Activity从返回栈移除后,就变成了销毁状态。

    1.4.3 Activity生存期

    Activity在各种状态之间切换时会调用相应的方法,如下:

    1. OnCreate():Activity第一次被创建的时候调用,可以在这里完成初始化和事件调用操作。
    2. OnStart():在Activity由不可见变得可见的时候调用。
    3. OnResume():在Activity准备好和用户进行交互的时候调用。
    4. OnPause():在Activity部分可见的时候调用。
    5. OnStop():在Activity完全不可见的时候调用。
    6. OnDestroy():在Activity销毁的时候调用。
    7. OnRestart():在Activity由不可见重新变为运行状态前调用。

    参考生存周期图,来自参考博客3

    在这里插入图片描述

    如果进程被系统杀掉了,则会直接调用OnCreate而不是OnRestart,同时由于一些临时数据会丢失,会影响用户体验,因此需要使用Activity中的OnSaveInstanceState方法来解决这个问题。OnSaveInstanceState方法会携带一个Bundle类型参数,可以提供一系列的方法保存变量。同时恢复的时候只需要在OnCreate()函数的第一个Bundle参数中即可获取。

    1.4.4 Activity启动模式

    在实际项目中可以为指定的Activity设置如下四种启动模式:

    1. standard
    2. singleTop
    3. singleTask
    4. singleInstance

    以上四种都可以在AndroidManifest.xml文件中通过给<activity>指定android:launchMode属性来设置,接下来分别介绍四种启动模式。

    1.standard

    默认的启动模式。每启动一个新Activity,就会在返回栈中入栈,并且处于栈顶位置,同时不管这个Activity是否已经在栈中存在,都会创建该Activity的新实例。

    2.singleTop

    与标准方式的区别在于,当启动新Activity时,如果发现Activity在栈中已经存在并且在栈顶,那么就不会创建新的实例而是用栈顶的这个实例。

    3.singleTask

    与singleTop模式的区别在于,当启动新Activity时,如果发现当前的Activity实例存在,不管是否在栈中哪个位置,都会将在该Activity上面的Activity实例全部出栈,然后使用该Activity。如果不存在则与标准模式相同,启动一个新的Activity。

    4.singleInstance

    与上面三种模式都不同,该模式下,指定了singleInstance的Activity会在一个新的返回栈中处理,这个返回栈可以与其它程序共享(注意,每个程序都有自己的返回栈),这样的意义在于,不同的程序可以共享同一个Activity实例。

    2. Intent

    2.1 Intent概念

    Intent是安卓程序中各个组件之间交互的一种重要方式,不仅可以执行各种动作,还可以传递数据。例如用于启动Activity、启动服务,发送广播等。同时Intent可以分为显式Intent和隐式Intent。

    2.2 显式Intent

    直接指定要启动的Activity。

    Intent intent = new Intent(this, SecondActivity.class);  
    startActivity(intent);  
    

    2.3 隐式Intent

    隐式Intent不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的<intent-filter>来筛选。

    <activity android:name="com.example.app.MainActivity">  
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>  
    

    action是一个字符串,表示执行的动作,category表示动作的类别,只有两个都匹配上了才能成功,并且支持跨程序调用同时,actioncategory都可以自定义。

    <intent-filter>
        <action android:name="android.intent.action.DIY_ACTION" />
        <category android:name="android.intent.category.DIY_CATEGORY" />
    </intent-filter>
    

    2.4 Intent传递数据

    第一个Activity启动第二个Activity:

    Intent intent = new Intent("com.example.app.SecondActivity");
    intent.putExtra("str","hello world");
    startActivity(intent);
    

    第二个Activity接收第一个传来的数据:

    getIntent().getStringExtra("str");
    

    当然还可以结合Intent和Bundle,同时保存多个数据在Bundle中再将Bundle放在Intent中进行传递数据。

    2.2 Intent返回数据

    第一个Activity启动第二个Activity:

    Intent intent = new Intent("com.example.app.SecondActivity");
    startActivityForResult(intent,1);
    

    第二个Activity返回数据:

    Intent data = new Intent();
    data.putExtra("str","helloworld");
    setResult(1,data);
    finish();
    

    这里的data只用来传递数据,没有任何意图。

    第一个Activity接收数据:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==1)
        {
            //...
        }
    }
    
    展开全文
  • 一章 开始启程,你的Android代码1.1.Android简介 1.1.1.Android系统架构 自下而上:Linux内核层(为硬件提供底层驱动。eg:显示驱动、音频驱动等)、系统运行时层(C/C++库和android运行时库,前者有Sqlite...

    1.1.Android简介
    1.1.1.Android系统架构

           自下而上:Linux内核层(为硬件提供底层驱动。eg:显示驱动、音频驱动等)、系统运行时层(C/C++库和android运行时库,前者有Sqlite和OpenGL等,后者有ART虚拟机和核心库等)、应用框架层(系统API,譬如ActivityManager、WindowManager、ContentProvider)、应用层(应用程序,譬如联系人、短信、自己开发的app等)。
           2020.3月逐渐推出Android 11版本。5.0使用ART虚拟机代替DVM虚拟机,提出Material Design来优化界面设计,5.0以上占比超过85%。
    1.1.2.Android应用开发特色
         (1)四大组件:Activity、Service、BroadcastReceiver、ContentProvider。Activity是应用程序显示的界面;Service后台默默运行,即使用户退出app;BroadcastReceiver使得app接受各处广播消息,也可以向外发出消息;ContentProvider可以使得app之间的数据共享。譬如:读取联系人;
        (2)丰富系统控件:Android界面系统控件和自定义控件。
        (3)SQLite数据库:轻量级、运算速度极快的嵌入式关系型数据库。支持SQL语法和系统API。
        (4)强大多媒体:音乐、视频、录音、拍照等。
    1.2.搭建开发环境
           JDK(java运行环境、工具集合、基础类库)+SDK(android开发工具包)+Android studio
    1.3.创建Android项目
    1.3.1.文件结构解析


    1.build:编译自动生成的文件
    2.gradle:gradle wrapper配置文件
    3..gitignore:哪些文件排除在版本控制之外
    4.Build.gradle:项目全局gradle脚本
    5.Grale.properties:全局gradle配置文件,配置相关属性
    6.gradlew和gradlew.bat:命令行界面执行gradle命令
    7.Local.properties:本机SDK路径
    8.Setting.gradle:制定项目所有引入的模块,目前只有app模块
    9.app目录:项目代码、资源
       9.1.build:系统自动生成文件
       9.2.libs:第三方jar包
       9.3.androiTest:Android test自动化测试用例
       9.4.Java:所有java代码放置地方,MainActivity.java
       9.5.res:图片、布局、字符串等
       9.6.AndroidManifest.xml:项目配置文件,譬如四大组件的定义
       9.7.Test:unit test自动化测试用例
       9.8.Build.gradle:app模块的gradle构建样本,项目构建相关配置
       9.9.Progurad-reles.pro:执行项目混淆规则
    10.res目录:图片、布局、字符串等


      10.1.drawable:图片
      10.2.Mipmap:图标(不同后缀更好兼容设备)
      10.3.Vaules:字符串、样式、颜色等。以下为values的内容


         通过R.string.app_name或者@string/app_name获得该字符串的引用。
    1.3.2.详解build.gradle文件
         最外层目录的build.gradle

    //Gradle是基于Groovy领域特定语言(DSL)来进行项目设置的。
    buildscript {
        ext.kotlin_version = '1.3.71'
        //闭包声明了两个代码仓库
        repositories {
            google() //google扩展依赖库
            jcenter()//第三方开源库
    
        }
        //使用classpath声明了两个插件
        dependencies {
            //Gradle插件的目的是构建android项目,与AS版本一致
            classpath 'com.android.tools.build:gradle:3.6.3'
            //Kotlin插件
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }
    
    allprojects {
        repositories {
            google()
            jcenter()
        }
    }

         app目录的build.gradle

    apply plugin: 'com.android.application'//应用程序模块,也可以设置为库模块
    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'//kotlin模块和扩展功能
    //项目构建的各个属性
    android {
        compileSdkVersion 28  //指定项目编译版本
        buildToolsVersion "29.0.3"  //Android10.0SDK编译
        //项目更多细节配置
        defaultConfig {
            applicationId "com.example.myapplication"//应用唯一标识符
            minSdkVersion 21///项目最低兼容版本,最低兼容5.0
            targetSdkVersion 28//目标版本,在该版本充分测试,启用新特性,9.0
            versionCode 1 //项目版本号
            versionName "1.0"//项目版本名
            //启用Junit测试用例
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
        //生成安装文件的相关配置
        buildTypes {
        //一般一个release包(正式版安装文件配置),一个debug包(测试版安装文件配置)。
            release {
                minifyEnabled false//是否对项目混淆
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
                //选择混淆规则
            }
        }
    
    }
    //指定项目所有依赖关系。本地依赖(jar包或者目录)、库依赖(项目中的库模块)和远程依赖(jcenter仓库开源项目)。
    dependencies {
        //implementation fileTree本地依赖,libs目录底下的所有jar包  
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        //implementation远程依赖声明,标准远程库格式,androidx.appcompat:为域名部分,appcompat为工程名,1.0.2是版本号
        //Gradle构建时会检查本地是否有库缓存,没有会自动联网下载并添加到项目构建路径
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
        implementation 'androidx.appcompat:appcompat:1.0.2'
        implementation 'androidx.core:core-ktx:1.0.2'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        //implementation project是库依赖,譬如一个库名叫help,可以声明为(implementation project('help'))
        //声明测试用例库的
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test.ext:junit:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    }

    1.4.日志工具
           Android中日志工具类是log。五个级别:log.v(verbose,琐碎的、意义最小的信息)、log.d(debug,调试信息)、log.i(info,重要信息,譬如分析用户数据行为信息)、log.w(warn,警告信息,潜在风险需要修复)、log.e(error,错误信息)。譬如:Log.d("MainActivity1","onCreate Create")。一个tag是传入当前类名,一个msg是打印具体内容。打印内容包括时间、进程号、类名和内容等。Logv可以看所有log信息。Logd可以看debug及以上级别的信息,依次类推。
          System.out.println相较于log,日志开关不可控、没有级别划分、不能添加日志标签。有四个过滤器。Show only selected applications显示当前选中程序的日志;firebase是开发者工具和基础架构平台,不用管。No filter没有过滤器,所有日志都会显示;edit fileter config自定义过滤器。

             

     
    展开全文
  • 《第一行代码第三版》总结篇

    千次阅读 2020-05-02 18:05:16
    今年4月郭霖大佬出版了新书《第一行代码第三版,与前几版不同的是以下几点:(1)编程语言基于Kotlin;(2)基于Android10.0开发;(3)提到JetPack、Retrofit、MVVM等全新的知识点。一方面学校因为疫情原因迟迟不...

           今年4月郭霖大佬出版了新书《第一行代码》第三版,与前几版不同的是以下几点:(1)编程语言基于Kotlin;(2)基于Android10.0开发;(3)提到JetPack、Retrofit、MVVM等全新的知识点。一方面学校因为疫情原因迟迟不开学,另一方面大论文已经提交。有幸拿到签名版的书后,开始利用这段时间尽快学习、总结。笔记链接如下:

          我的第一行Android代码(一)

          Kotlin编程入门上篇(二)

          Kotlin编程入门下篇(三)

          探究Activity(四)

          UI开发入门(五)

          探究Fragment(六)

          详解广播机制(七)

          数据存储方案(八)

          探究ContentProvider(九)

          通知、多媒体(十)

          编写开源库(十九)

     

    展开全文
  • ListView的demo在网上有很多,自己去找。。。 1、基本用法 <!-- main.xml --> ... 所以需要构建适配器就了。... android.R.layout.simple_list_item_1是作为ListView子项布局的id,它是android内置的布局...它的二...
  • 从上诉代码中可以看出,最主要的实现还是在adapter上。 首先新建一个PictureAdapter类,继承RecyclerView.Adapter,并将泛型指定为PictureAdapter.ViewHolder。ViewHolder为PictureAdapter中定义的一个内部类。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,910
精华内容 5,164
关键字:

第三行代码