






















Activity
Layout
R.layout.first_layoutR.id.button1Toast
menu
ComponentActivitylayout 文件增加 Toolbarres/values/theme 修改主题为 Theme.AppCompat.Light.NoActionBarMain.kt
package com.example.helloworld
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout) // 设置 layout
val toolbar: Toolbar = findViewById(R.id.toolbar) // 绑定工具栏
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true) // 设置返回按钮
val button1: Button = findViewById(R.id.button) // 通过 id 找到 view, 并指明类型为 button
button1.setOnClickListener{
Toast.makeText(this, "You clicked Button 1", Toast.LENGTH_SHORT).show() // layout 为 context
}
Log.d("MainActivity", "onCreate execute")
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean { // 工具栏右边的 ... 菜单
menuInflater.inflate(R.menu.main, menu)
return true
}
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
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<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>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.HelloWorld" parent="Theme.AppCompat.Light.NoActionBar" />
</resources>
作用:
启动 Activity,启动 Service,发送广播,传递数据
主 Intent 中会有 intent-filter 相关设置
分类
Activity1 中通过 Intent 对象和 startActivity 函数启动特定 Activity数据传输
intent.putExtra(key, data)data = intent.getStringExtra(key)startActivityForResult(intent, 1)onActivityResultintent.putExtra(key, data)setResult(RESULT_OK, intentAndroidManifest.xml 和主代码中指定.DEFAULT 是默认 category,能自动添加到 intent 中intent 只能指定一个 action,但是可以指定多个 categoryxml 的格式,以及 android:exported 需要改为 true【暂不学习】
Activity1
package com.example.helloworld
import android.app.ComponentCaller
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout) // 设置 layout
val toolbar: Toolbar = findViewById(R.id.toolbar) // 绑定工具栏
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true) // 设置返回按钮
val button1: Button = findViewById(R.id.button) // 通过 id 找到 view, 并指明类型为 button
button1.setOnClickListener{
Toast.makeText(this, "You clicked Button 1", Toast.LENGTH_SHORT).show() // layout 为 context
val intent = Intent(this, MainActivity2::class.java)
val data = "Hello Activity2"
intent.putExtra("first_data", data) // 发送数据,类似map,第一个为键,用于选择哪个值,后者为值
// startActivity(intent)
startActivityForResult(intent, 1) // 接受数据时调用这个函数表明需要返回一个结果,1代表请求码
}
Log.d("MainActivity", "onCreate execute")
}
override fun onActivityResult( // 由于调用 startActivityForResult,因此需要重写方法来得到返回的数据
requestCode: Int,
resultCode: Int,
data: Intent?,
caller: ComponentCaller
) {
super.onActivityResult(requestCode, resultCode, data, caller)
when(requestCode){
1 -> if(resultCode == RESULT_OK){
val returnedData = data?.getStringExtra("data_return")
Log.d("Activity1", "returned data is $returnedData")
}
}
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean { // 工具栏右边的 ... 菜单
menuInflater.inflate(R.menu.main, menu)
return true
}
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
}
}
Activity2
package com.example.helloworld
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
class MainActivity2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.second_layout) // 设置 layout
val toolbar: Toolbar = findViewById(R.id.toolbar2) // 绑定工具栏
val extraData = intent.getStringExtra("first_data") // 接收数据
Log.d("Activity2", "data is $extraData")
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true) // 设置返回按钮
toolbar.setNavigationOnClickListener { finish() } // 设置结束 act2
val button2: Button = findViewById(R.id.button2) // 通过 id 找到 view, 并指明类型为 button
button2.setOnClickListener {
val intent = Intent()
intent.putExtra("data_return", "Hello Activity1")
setResult(RESULT_OK, intent)
finish()
}
}
}
firstlayout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
secondlayout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
activity1
package com.example.helloworld
import android.app.ComponentCaller
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout) // 设置 layout
val toolbar: Toolbar = findViewById(R.id.toolbar) // 绑定工具栏
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true) // 设置返回按钮
val button1: Button = findViewById(R.id.button) // 通过 id 找到 view, 并指明类型为 button
button1.setOnClickListener{
val intent = Intent("com.example.helloworld.ACTION_START")
intent.addCategory("com.example.helloworld.MY_CATEGORY")
startActivity(intent)
}
Log.d("MainActivity", "onCreate execute")
}
}
AndroidManifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HelloWorld">
<activity
android:name=".MainActivity2"
android:exported="true"
android:label="@string/title_activity_main2"
android:theme="@style/Theme.HelloWorld" >
<intent-filter>
<action android:name="com.example.helloworld.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.helloworld.MY_CATEGORY"/>
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.HelloWorld">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
finish 的 Activity 在栈顶被移除| 状态 | 内容 |
|---|---|
| 生存期 | 操作 | 细节 | 操作 | 细节 | 整体细节 |
|---|---|---|---|---|---|
onRestart:从停止状态变为**运行状态 **有 MainActivity,NormalActivity 和 DialogActivity,其中 DialogActivity 不是全屏,点击 MainActivity 的两个按钮可以启动对应 Activity
onSaveInstanceState 回调
Bundle 类型参数,提供一些列方法保存不同的数据// 保存数据
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val tempData = "Something"
outState.putString("data_key", tempData)
}
// 取出数据(在onCreate函数中)
if(savedInstanceState != null){ // 取出数据
val tempData = savedInstanceState.getString("data_key")
Log.d("saved_data", "tempData is $tempData")
}
val tempData = savedInstanceState?.getString("data_key") // 简化写法
tempData?.let{Log.d("saved_data", "tempData is $it")}
| 启动模式 | 特征 | 具体 | 原理图 |
|---|---|---|---|
// 伴生类
companion object {
fun actionStart(context: Context, data1: String, data2: String) {
val intent = Intent(context, MainActivity2::class.java).apply {
putExtra("param1", data1)
putExtra("param2", data2)
}
context.startActivity(intent) // 没有 startActivityForResult
}
}
//调用启动
button1.setOnClickListener{
actionStart(this, "Activity1", "") // 启动 Activity
}
【暂未完成返回数据到上一个 Activity】
package com.example.helloworld
import android.app.ComponentCaller
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 设置 layout
setContentView(R.layout.first_layout)
ActivityCollector.addActivity(this)
// 绑定工具栏
val toolbar: Toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
// 设置返回按钮
supportActionBar?.setDisplayHomeAsUpEnabled(true)
// 取出保存的数据
val tempData = savedInstanceState?.getString("data_key")
tempData?.let{Log.d("saved_data", "tempData is $it")}
// 通过 id 找到 view, 并指明类型为 button
val button1: Button = findViewById(R.id.button)
// 启动 Activity
button1.setOnClickListener{
actionStart(this, "Activity1", "")
}
}
override fun onDestroy() {
super.onDestroy()
ActivityCollector.removeActivity(this)
}
// 工具栏右边的 ... 菜单
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main, menu)
return true
}
// 菜单按钮的点击逻辑
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
}
// 伴生类 启动 Activity
companion object {
fun actionStart(context: Context, data1: String, data2: String) {
val intent = Intent(context, MainActivity2::class.java).apply {
putExtra("param1", data1)
putExtra("param2", data2)
}
context.startActivity(intent) // 没有 startActivityForResult
}
}
// 保存杀死后台之后的数据
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val tempData = "Something"
outState.putString("data_key", tempData)
}
}
package com.example.helloworld
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
class MainActivity2 : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.second_layout)
// toolbar 部分
val toolbar: Toolbar = findViewById(R.id.toolbar2)
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true) // 设置返回按钮
toolbar.setNavigationOnClickListener { finish() } // 设置结束 act2
ActivityCollector.addActivity(this)
// 从前一个 Activity 接收数据
val extraData1 = intent.getStringExtra("param1")
val extraData2 = intent.getStringExtra("param2")
Log.d("Activity2", "param1 is $extraData1, param2 is $extraData2")
// 返回数据(但是未实现)
val button2: Button = findViewById(R.id.button2) // 通过 id 找到 view, 并指明类型为 button
button2.setOnClickListener {
val intent = Intent().apply { putExtra("data_return", "Hello Activity1") }
setResult(RESULT_OK, intent)
finish()
}
// 关闭所有 Activity
val button3: Button = findViewById(R.id.button3)
button3.setOnClickListener {
ActivityCollector.finishAll()
}
}
}
package com.example.helloworld
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.snackbar.Snackbar
// 输出当前是哪一个 Activity
open class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("BaseActivity", "${javaClass.simpleName} is created")
}
override fun onStart() {
super.onStart()
Log.d("BaseActivity", "${javaClass.simpleName} is started")
}
override fun onResume() {
super.onResume()
Log.d("BaseActivity", "${javaClass.simpleName} is resumed")
}
}
// Activity 管理
object ActivityCollector {
private val activities = ArrayList<Activity>()
fun addActivity(activity: Activity){
activities.add(activity)
}
fun removeActivity(activity: Activity){
activities.remove(activity)
}
fun finishAll() {
activities.forEach {
if(!it.isFinishing) {
it.finish()
}
}
activities.clear()
}
}
fun startNewActivity(context: Context, targetActivity: Class<out AppCompatActivity>) {
val intent = Intent(context, targetActivity)
context.startActivity(intent)
}
// 调用方法 startNewActivity(this, ActivityClass::class.java)
fun startNewActivity(context: Context, targetActivity: Class<out AppCompatActivity>, data1: String, data2: String) {
val intent = Intent(context, targetActivity).apply {
putExtra("param1", data1)
putExtra("param2", data2)
}
context.startActivity(intent)
}
fun startNewActivityAndFinish(activity: Activity, targetActivity: Class<out AppCompatActivity>) {
val intent = Intent(activity, targetActivity)
activity.startActivity(intent)
activity.finish()
}
// 调用方法 "This is Toast".showToast(context, Toast.LENGTH_LONG)
fun String.showToast(context: Context, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(context, this, duration).show()
}
fun Int.showToast(context: Context, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(context, this, duration).show()
}
/* 调用方法
* view.showSnackBar("This is SnackBar", "Action") {
* //
* 处理具体的逻辑
* }
**/
fun View.showSnackBar(text: String, actionText: String? = null,
duration: Int = Snackbar.LENGTH_SHORT, block: (() -> Unit)? = null) {
val snackBar = Snackbar.make(this, text, duration)
if (actionText != null && block != null) {
snackBar.setAction(actionText) {
block()
}
}
snackBar.show()
}
fun View.showSnackBar(resId: Int, actionResId: Int? = null,
duration: Int = Snackbar.LENGTH_SHORT, block: (() -> Unit)? = null) {
val snackBar = Snackbar.make(this, resId, duration)
if (actionResId != null && block != null) {
snackBar.setAction(actionResId) {
block()
}
}
snackBar.show()
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Quit App" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HelloWorld">
<activity
android:name=".MainActivity2"
android:exported="true"
android:label="@string/title_activity_main2"
android:theme="@style/Theme.HelloWorld" >
<intent-filter>
<action android:name="com.example.helloworld.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.helloworld.MY_CATEGORY"/>
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.HelloWorld">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.HelloWorld" parent="Theme.AppCompat.Light.NoActionBar" />
</resources>
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。