《第一行代码》第三版笔记二

目录

第三章

3.1Activity的基本用法

3.1.1设置主Activity

3.1.2在Activity中使用Toast

3.1.3在Activity中使用Menu

3.2销毁一个Activity

3.3使用Intent

3.3.1显示Intent

3.3.2隐式Intent

3.4向下一个Activity传递数据        

3.5返回数据给上一个Activity

3.6Activity的生命周期

3.8标准函数

3.9静态方法


第三章

3.1Activity的基本用法

        onCreate()方法中,调用setContentView()方法传入一个布局文件的id。

        在AndroidManifest.xml中的<application>标签内注册。

3.1.1设置主Activity

        在标签内部加入<intent - filter>标签,并在<intent - filter>标签内部添加

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER" />这两句声明即可

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.example.activitytest">
     <application
         ...>
         <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>
     </application>
</manifest>
3.1.2在Activity中使用Toast

        通过静态方法makeText()创建出一个Toast对象,然后调用show() 将Toast显示出来。makeText()方法需要传入3个参数。第一个参数是Context,即Toast要求的上下文。第二个参数是Toast显示的文本内容。第三个参数是Toast显示的时长,有两个内置常量可以选择:Toast.LENGTH_SHORT(2秒)Toast.LENGTH_LONG(3.5秒)

Toast.makeText(this, "show msg", Toast.LENGTH_SHORT).show()

3.1.3在Activity中使用Menu

        1、创建Menu resource file

<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>

        2、在Activity中重写onCreateOptionsMenu()方法。

       在onCreateOptionsMenu()方法中编写的menuInflater使用了语法糖, 调用了父类的getMenuInflater()方法。getMenuInflater()方法能够得到一个MenuInflater对象,再调用它的inflate()方法,就可以给当前Activity创建菜单了。 inflate()方法接收两个参数:第一个参数用于指定通过哪一个资源文件来创建菜单,这里传入上文中创建的Menu resource file;第二个参数用于指定菜单项将添加到哪一个Menu对象当中,这里直接使用onCreateOptionsMenu()方法中传入的menu参数。最后给这个方法返回true,表示允许创建的菜单显示出来,如果返回了false,创建的菜单将无法显示。

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
     menuInflater.inflate(R.menu.main, menu)
     return true
}

        3、 设置菜单的响应事件。

        在onOptionsItemSelected()方法中,我们通过调用item.itemId来判断点击的是哪一个

菜单项。
override fun onOptionsItemSelected(item: MenuItem): Boolean {
     when (item.itemId) {
         R.id.add_item -> Toast.makeText(this, "You clicked Add",
             Toast.LENGTH_SHORT).show()
         R.id.remove_item -> Toast.makeText(this, "You clicked Remove",
             Toast.LENGTH_SHORT).show()
     }
     return true
}
3.2销毁一个Activity

        除了使用返回键,还可以使用finish()方法。

btn.setOnClickListenter{
    finish()
}
3.3使用Intent

        Intent分为显示Intent和隐式Intent

3.3.1显示Intent

        第一个参数context,即启动Activity的上下文;第二个参数Class用于指定想要启动的目标Activity,最后将构建好的intent传入startActivity()方法。

button1.setOnClickListener {
     val intent = Intent(this, SecondActivity::class.java)
     startActivity(intent)
}
3.3.2隐式Intent

        在AndroidManifest.xml文件中的<activity>标签下,配置能够响应的action和category。

<activity android:name=".FirActivity" >
     <intent-filter>
         <action android:name="com.example.activitytest.ACTION_START" />
         <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>
</activity>

        将acton字符串传入Intent,由于android.intent.category.DEFAULT是一种默认的category所以不用指定category

button1.setOnClickListener {
     val intent = Intent("com.example.activitytest.ACTION_START")
     startActivity(intent)
}

        一个Intent只能指定一个action,但能指定多个catagory。

在<intent-filter>标签下注册category
<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>
</activity>


在Activity中指定多个category:
button1.setOnClickListener {
     val intent = Intent("com.example.activitytest.ACTION_START")
     intent.addCategory("com.example.activitytest.MY_CATEGORY")
     startActivity(intent)
}

3.3.3更多隐式Intent用法

        使用Intent启动其他程序的Activity :

button1.setOnClickListener {
     val intent = Intent(Intent.ACTION_VIEW)
     intent.data = Uri.parse("https://www.baidu.com")
     startActivity(intent)
}

       上文中指定了IntentactionIntent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW。然后通过Uri.parse()方法将一个网址字符串解析成一个Uri对象,再调用IntentsetData()方法将这个Uri对象传递进去,效果为打开系统浏览器进入百度页面。

        除此之外还可以在<intent - filter>标签中配置<data>标签,用于更精确地指定当前Activity能够响应的数据。<data>标签中主要可以配置以下内容:

  • android:scheme。用于指定数据的协议部分,如上例中的https部分。
  • android:host。用于指定数据的主机名部分,如上例中的www.baidu.com部分。
  • android:port。用于指定数据的端口部分,一般紧随在主机名之后。
  • android:path 。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内
    容。
  • android:mimeType 。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
        只有当<data>标签中指定的内容和Intent中携带的Data 完全一致时,当前 Activity 才能够响应
Intent。
<activity android:name=".ThirdActivity">
     <intent-filter tools:ignore="AppLinkUrlError">
         <action android:name="android.intent.action.VIEW" />
         <category android:name="android.intent.category.DEFAULT" />
         <data android:scheme="https" />
     </intent-filter>
</activity>
3.4向下一个Activity传递数据        

        1、使用putExtra()方法。第一个参数是键,用于之后从Intent中取值,第二个参数才是真正要传递的数据。

button1.setOnClickListener {
     val data = "Hello SecondActivity"
     val intent = Intent(this, SecondActivity::class.java)
     intent.putExtra("extra_data", data)  // 第一个参数是键,第二个参数是要传递的数据
     startActivity(intent)  // 使用startActivity启动
}

        2、使用getStringExtra()方法中传入键值将数据取出。

class SecondActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.second_layout)
         val extraData = intent.getStringExtra("extra_data")  //使用getStringExtra方法取出
         Log.d("SecondActivity", "extra data is $extraData")
     }
}
3.5返回数据给上一个Activity

       1、使用startActivityForResult()方法启动activity。startActivityForResult方法接收两个参数,第一个参数是intent;第二个参数是请求码

button1.setOnClickListener {
     val intent = Intent(this, SecondActivity::class.java)
     startActivityForResult(intent, 1) // 使用startActivityForResult启动activity
}

        2、在启动的activity中,调用putExtra方法将数据传入;调用setResult()方法向上一个activity返回数据,setResult()方法接收两个参数:第一个参数用于向上一个Activity返回处理结果,一般只使用RESULT_OKRESULT_CANCELED这两个值;第二个参数则把带有数据的Intent传递回去。最后调用finish()方法销毁当前Activity.

class SecondActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.second_layout)
         button2.setOnClickListener {
             val intent = Intent()
             intent.putExtra("data_return", "Hello FirstActivity") 
             setResult(RESULT_OK, intent)  // setResult方法返回数据
             finish()
         }
     }
}

        3、SecondActivity被销毁之后会回调上一个Activity的onActivityResult()方法,因此需要重写onActivityResult()方法。

        onActivityResult()方法带有3个参数:第一个参数requestCode,即我们在启动Activity 时传入的请求码;第二个参数resultCode,即我们在返回数据时传入的处理结果;第三个参数data,即携带着返回数据的Intent

        由于在一个Activity中有可能调用startActivityForResult()方法去启动很多不同的Activity,每一个Activity返回的数据都会回调到onActivityResult()这个方法中,因此需要过检查requestCode的值来判断数据来源。确定数据是从SecondActivity返回的之后,通过resultCode的值来判断处理结果是否成功,最后将值取出。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
     super.onActivityResult(requestCode, resultCode, data)
     when (requestCode) {
         1 -> if (resultCode == RESULT_OK) {
         val returnedData = data?.getStringExtra("data_return")
         }
     }
}
3.6Activity的生命周期
  • onCreate()
  • onStart()
  • onReaume()
  • onPause()
  • onStop()
  • onDestroy()

3.7Activity的启动模式

  • standard    在standard模式下,每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。
  • singleTop    在启动Activity时如果发现返回栈的栈顶已经是该Activity,则直接使用它,不会再创建新的Activity实例。
  • singleTask    每次启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并把在这个Activity之上的所有其他Activity统统出栈,如果没有发现就会创建一个新的Activity实例。
  • singleInstance    在这种模式下,会有一个单独的返回栈来管理这个Activity,不管是哪个应用程序来访问这个Activity,都共用同一个返回栈。
3.8标准函数

        with、run、apply

        with函数:
val result = with(obj) {
     // 这里是obj的上下文
     "value" // with函数的返回值
}

        run函数:

val result = obj.run {
     // 这里是obj的上下文
     "value" // run函数的返回值
}

        apply函数:

val result = obj.apply {
     // 这里是obj的上下文
}
// result == obj
3.9静态方法

        Kotlin中实现静态方法的两种方式:注解和顶层方法

        1、给单例类或companion object 中的方法加上@JvmStatic注解( @JvmStatic 注解只能加在单例类或 companion object 中的方法上)。
class Util {
     fun doAction1() {
         println("do action1")
     }

     companion object {

         @JvmStatic
         fun doAction2() {
             println("do action2")
        }
    }
}

        2、顶层方法指的是那些没有定义在任何类中的方法:

fun doSomething() {
     println("do something")
}

### 关于郭霖《第一行代码第三版章的学习笔记 在郭霖的《第一行代码第三版中,第章主要围绕 Android 应用的基础概念展开,介绍了如何创建第一个 Android 项目以及理解项目的结构。以下是基于已有引用内容和专业知识整理的相关学习笔记: #### 创建 Android 项目 为了开发 Android 应用程序,开发者需要准备必要的工具并搭建开发环境。这些工具包括但不限于 JDK (1.8 或更高本)[^1]、Android SDK 和集成开发环境 Android Studio[^1]。 一旦安装完成,可以通过 Android Studio 的向导界面来创建一个新的 Android 项目。在此过程中,开发者可以选择目标设备类型(如手机和平板)、设置最低支持的 API 本(通常建议从 API 15 开始,即 Android 4.0),以及其他配置选项[^3]。 #### 理解 Android 项目结构 新创建的 Android 项目会自动生成一系列文件夹和文件,其中一些重要的部分包括: - **`app/src/main/java/`**: 存放 Java/Kotlin 源码的地方。 - **`res/` 文件夹**: 资源目录,用于存储布局 XML 文件、图片资源和其他静态数据。 - **`AndroidManifest.xml`**: 定义应用程序的核心元信息,比如活动组件 (`Activity`) 和权限声明。 #### 显式与隐式 Intent 的使用 Intent 是 Android 中一种非常重要的机制,用来描述一个操作的动作及其携带的数据。当通过 `Intent(context, TargetClass.class)` 这种方式指定要跳转的目标 Activity 时,则称为显式 Intent[^2];相对应地,如果仅指定了动作类别或者 MIME 类型而不具体指向某个 Component,则属于隐式 Intent。 #### 多线程处理简介 对于耗时较长的操作,应该避免阻塞主线程以免影响用户体验。为此可以利用多线程技术,在后台执行复杂计算或网络请求等工作负载。最简单的做法就是继承 Thread 类重载 run 方法,或者是实现 Runnable 接口并将其实例传递给新的 Thread 对象实例化之后调用 start 方法即可开启子线程运行相应任务[^4]。 ```java // 实现Runnable接口的方式启动线程 new Thread(new Runnable() { @Override public void run() { // 执行耗时操作 } }).start(); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值