{"id":20271013,"url":"https://github.com/swiftdo/android_learn","last_synced_at":"2026-05-07T12:38:07.395Z","repository":{"id":133783910,"uuid":"404176912","full_name":"swiftdo/android_learn","owner":"swiftdo","description":"android kotlin 学习项目","archived":false,"fork":false,"pushed_at":"2021-09-16T13:26:25.000Z","size":114,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-14T05:45:22.936Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/swiftdo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-09-08T01:49:07.000Z","updated_at":"2021-09-16T13:26:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"46a92814-e8c7-45aa-a194-0fd3c0da1ec0","html_url":"https://github.com/swiftdo/android_learn","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fandroid_learn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fandroid_learn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fandroid_learn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fandroid_learn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/swiftdo","download_url":"https://codeload.github.com/swiftdo/android_learn/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241758954,"owners_count":20015249,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T12:35:42.152Z","updated_at":"2026-05-07T12:38:02.359Z","avatar_url":"https://github.com/swiftdo.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 学习项目\n\n\n## Kotlin 基础\n\nval (value 的简写)用来声明一个不可变的变量。\nvar (variable 的简写)用来声明一个可变的变量。\n\n### 基础数据类型：\n\nInt, Long, Short, Float, Double, Boolean, Char, Byte\n\n```kotlin\nvar a: Int = 10\na = a * 10\nprintln(\"a = \" + a)\n```\n\n### 函数：\n\n```kotlin\nfun largerNumber(num1: Int, num2: Int): Int {\n    return max(num1, num2)\n}\n\nfun largerNumber2(num1: Int, num2: Int) = max(num1, num2)\n\n\n\n/// 匹配值 -\u003e { 执行逻辑 }\nfun getScore(name: String = \"Tom\") = when (name) {\n    \"Tom\" -\u003e 86\n    \"Jim\" -\u003e 77\n    \"Lily\" -\u003e 100\n    else -\u003e 0\n}\n\nval range = 0..10 // [0, 10]两端都是闭区间\nfor (i in 0..10) {\n    println(i)\n}\n\nval range = 0 until 10 // [0, 10)\nfor (i in 0 until 10 step 2) {\n    println(i) // 0 2 4 6 8\n}\n\n\nfor (i in 10 downTo 1) { \n    println(i) // 10 , 9, 8, ... , 1\n}\n```\n\n### 面向对象\n\n```kotlin\n// 需要添加open 关键字才可以被继承\nopen class Persion(val name: String, val age: Int) {}\n\nclass Student(val sno: String, val grade: Int, name: String, age: Int): Persion(name, age) {\n    init {\n        println(\"sno is\" + sno)\n        println(\"grade is \" + grade)\n    }\n    \n    // 次构造器\n    constructor(name: String, age: Int): this(\"\", 0, name, age)\n}\n```\n\n### 接口\n\n```kotlin\ninterface Study {\n    fun readBooks()\n    \n    // 提供默认实现\n    fun doHomework() {\n        println(\"do homework\")\n    }\n}\n\nclass Student(name: String, age: Int) : Persion(name, age), Study {\n    override fun readBooks() {\n        println(name + \"is reading\")\n    }\n}\n```\n\n\npublic 所有类可见，private 当前类可见，protected 当前类和子类可见, internal 同一模块的类可见\n\n### 单例\n\n```kotlin\nobject Singleton {}\n```\n\n使用单例类的写法会将整个类中的所有方法全部变为类似静态方法的掉员工方式。而如果我们只希望让类中的某一方法变成静态方法的调用方式：\n\n```kotlin\nclass Util {\n    fun doAction() {\n        \n    }\n    \n    companion object {\n        fun duAction2() {\n            \n        }\n    }\n}\n\nUtil().doAction()\nUtil.duAction2()\n```\n\nKotlin 没有直接定义静态方法的关键字，但是提供给了一些语法特性来支持类似于静态方法的调用写法。\n\n\n\n### Lambda\n\n{参数名1： 参数类型，参数名2: 参数类型 -\u003e 函数体 }\n\n```kotlin\nval list = ArrayList\u003cString\u003e()\nlist.add(\"apple\")\nlist.add(\"banana\")\n\nvar list = listOf\u003cString\u003e(\"apple\", \"banana\")\n\nlist.maxBy({fr : String -\u003e fr.length })\n\nvar map = HashMap\u003cString, Int\u003e()\nmap.put(\"apple\", 1)\nmap.put(\"banan\", 2)\nmap[\"tmp\"] = 3\n\nvar map = mapOf(\"Apple\" to 1, \"banan\" to 2)\n\nfor ((k, v) in map) {\n    println(\"key is \" + k + \"value is\" + v)\n}\n```\n\n\nlet 函数： 后面的lambda 表达式中的代码会立即执行，并且这个obj 对象本身还会传递到 Lambda 表达式中\n\n```kotlin\nobj.let { obj2 -\u003e \n    // 编写具体业务\n}\n\n/// ?. 操作符表示对象为空什么都不做，对象不为空就用let函数，而let 函数会将 study 对象本身传递到 lambda 中。此时 study 肯定不为空\nfun doStudy(study: Study?) {\n    study?.let {stu -\u003e \n        stu.readBooks()\n    }\n}\n```\n\n```kotlin\n\n\"hello, ${obj.name} nice to meet you\"\n\"hello, $name nice to meet you!\"\n```\n\n\n## android\n\n重写方法快捷键： control + O\n\n### Intent\n\nIntent 是android 程序中各组件之间进行交互的一种重要方式，它不仅可以指明当前组件想要执行的动作，还可以在不同组件之间传递数据。\nIntent 一般可用于启动Activity,启动 Service 以及发送广播等场景\n\nIntent 大致可分为：显示Intent 和隐式Intent\n\n```kotlin\nbtn.setOnClickListener {\n    val intent = Intent(this, FirstActivity::class.java)\n    startActivity(intent)\n}\n```\nIntent 的意图非常明显，所以这种叫做 显示 Intent\n\n隐式的话，相对比较含蓄，并不明确指出想要启动哪个activity,而是指定一些类更为抽象的 action 和 category 等信息，\n然后交由系统去分析这个 intent,并帮我们找出合适的Activity.\n\n```xml\n \u003cactivity\n    android:name=\".FirstActivity\"\n    android:exported=\"true\" \u003e\n    \u003cintent-filter\u003e\n        \u003caction android:name=\"com.example.android_learn.ACTION_START\" /\u003e\n        \u003ccategory android:name=\"android.intent.category.DEFAULT\"/\u003e\n    \u003c/intent-filter\u003e\n\u003c/activity\u003e\n```\n\n```kotlin\nbtn.setOnClickListener {\n    val intent = Intent(\"com.example.android_learn.ACTION_START\")\n    startActivity(intent)\n}\n```\n\n`\u003caction\u003e` 标签中我们指定了当前 Activity 可以响应的 action, 而 `\u003ccategory\u003e` 标签则包含了一些附加信息，更精确地指明了当前 Activity 能够响应的 Intent \n中还可能带有的 category. 只有 action 和 category 同时匹配，这个 activity 才能响应该 Intent.\n\n而 `android.intent.category.DEFAULT` 是一种默认的category, 在调用 startActivity() 方法的时候会自动将这个 activity 添加到 Intent 中。\n\n```kotlin\nbtn.setOnClickListener {\n    val intent = Intent(\"com.example.android_learn.ACTION_START\")\n    intent.addCategory(\"com.example.android_learn.My_CATEGORY\")\n    startActivity(intent)\n}\n```\n\n### 数据传递\n\n#### 正向传递\n\nIntent 中提供了一系列的 putExtra() 方法的重载，可以把数据暂存在 Intent 中，启动另一个Activity 后，只要把这个数据从 Intent 中取出来即可。\n\n```kotlin\nbtn.setOnClickListener {\n    val intent = Intent(this, FirstActivity::class.java)\n    intent.putExtra(\"extra_data\", \"hello oldbirds\")\n    startActivity(intent)\n}\n```\n\n```kotlin\noverride fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContentView(R.layout.activity_first)\n    val extraData = intent.getStringExtra(\"extra_data\")\n    Log.d(\"FirstActivity\", \"extradta is $extraData\")\n}\n```\n\n#### 反向传值\n\n通过 `startActivityForResult()`\n\n```kotlin\nval btn = findViewById\u003cButton\u003e(R.id.first_active_back)\nbtn.setOnClickListener { \n    val intent = Intent()\n    intent.putExtra(\"data_return\", \"返回数据\")\n    setResult(RESULT_OK, intent)\n    finish()\n}\n```\n\n```kotlin\nbtn.setOnClickListener {\n    val intent = Intent(this, FirstActivity::class.java)\n    intent.putExtra(\"extra_data\", \"hello oldbirds\")\n    startActivityForResult(intent, 1)\n}\n\noverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n    super.onActivityResult(requestCode, resultCode, data)\n    when(requestCode) {\n        1 -\u003e if (resultCode == RESULT_OK) {\n            val returnData = data?.getStringExtra(\"data_return\")\n            Log.d(\"MainActivity\", \"returned data is $returnData\")\n        }\n    }\n}\n```\n\n#### activity 的生存期\n\n* onCreate() , Activity 第一次被创建的时候调用，你应该在整个方法中完成 Activity 的初始化操作，比如加载布局，绑定时间等\n* onStart(). Activity 由不可见变为可见的时候调用\n* onResume() , Activity 准备好喝用户进行交互的时候调用，此时的Activity 已定位与返回栈的栈顶，并且处于运行状态\n* onPause() , 系统准备去启动或者回复赢一个Activity 的时候调用\n* onStop（）， 在 Activity 完全不可见的时候调用\n* onDestroy(), 这个方法在 Activity 被销毁前调用 \n* onRestart() ，Activity 由停止状态变为运行状态之前调用\n\n## 控件\n\n### TextView\ngravity: 指定文章的对其方式，可以是 top,bottom,start, end, center, 可以用|同时指定多个值，\n\n### Button \n\n默认文本全是大写，可以通过 textAllCaps = \"false\" 设置\nid: \"@+id/button\"\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswiftdo%2Fandroid_learn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswiftdo%2Fandroid_learn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswiftdo%2Fandroid_learn/lists"}