3.1 Activity是什么
3.2 Activity是什么
3.2.1 手动创建Activity
3.2.2 创建和加载布局
3.2.3 在AndroidManifest文件中注册
3.2.4 在Activity中使用Toast
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button1: Button = findViewById(R.id.button1)
button1.setOnClickListener {
Toast.makeText(this, "clicked button 1 ", Toast.LENGTH_LONG).show()
}
}
}
3.2.5 在Activity中使用Menu
目录:res/menu下,创建xml文件如下:
<?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>
# 重写如下方法
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main, menu)
return true
// return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId){
R.id.add_item -> Toast.makeText(this, "Add", Toast.LENGTH_LONG).show()
R.id.remove_item -> Toast.makeText(this, "remove", Toast.LENGTH_LONG).show()
}
return true
}
3.2.6 销毁一个Activity
button1.setOnClickListener {
Toast.makeText(this, "clicked button 1 ", Toast.LENGTH_LONG).show()
finish() # 销毁
}
3.3 使用Intent在Activity之间穿梭
3.3.1 使用显式Intent
第一步:新建一个Activity和一按钮
第二步: 在第一Activity按钮中,添加如下代码
val intent = Intent(this, Activity_2::class.java)
startActivity(intent)
3.3.2 使用隐式intent
第一步:在androidManifest.xml中添加如下代码:
<activity android:name=".Activity_2"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.Activity_2"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.MY_CATEGORY"/>
</intent-filter>
</activity>
第二步: 在第一个Activity按钮中,添加如下代码
val intent = Intent("android.intent.action.Activity_2")
intent.addCategory("android.intent.category.MY_CATEGORY")
startActivity(intent)
3.3.3 更多隐式Intent的用法
第一步:创建一个Activity_3, 在androidManifest.xml中添加如下代码:
<activity
android:name=".Activity_3"
android:exported="true">
<intent-filter tools:ignore="ApplinkUrlError">
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="https"/>
</intent-filter>
</activity>
第二步: 在第一个Activity按钮中,添加如下代码
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.baidu.com")
startActivity(intent)
另一个intent的使用方法:
3.3.4 向下一个Activity传递数据
第一步:在主Activity按钮中添加如下代码:
val data = "hello Activity_2"
val intent = Intent(this, Activity_2::class.java)
intent.putExtra("extra_data", data)
startActivity(intent)
第二步:在第二个Activity中添加如下代码:
val extraData = intent.getStringExtra("extra_data")
button2.setOnClickListener{
Toast.makeText(this, "Hello" + extraData, Toast.LENGTH_LONG).show()
}
3.3.5 返回数据给上一个Activity
第一步:在主Activity按钮中添加如下代码
companion object{
var get_data: String? = "_ABC"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button1: Button = findViewById<Button>(R.id.button1)
val button11: Button = findViewById<Button>(R.id.button11)
button1.setOnClickListener {
Toast.makeText(this, "clicked button 1 ", Toast.LENGTH_LONG).show()
val data = "hello Activity_2"
val intent = Intent(this, Activity_2::class.java)
intent.putExtra("extra_data", data)
requestDataLauncher.launch(intent)
}
button11.setOnClickListener {
Toast.makeText(this, "clicked button 11 " + get_data, Toast.LENGTH_LONG).show()
}
}
private val requestDataLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
val data = result.data?.getStringExtra("data")
MainActivity.get_data = data
// Handle data from SecondActivity
}
}
第二步:在第二个Activity_2添加如下代码:
val extraData = intent.getStringExtra("extra_data")
button2.setOnClickListener{
Toast.makeText(this, "Hello" + extraData, Toast.LENGTH_LONG).show()
val intent = Intent()
intent.putExtra("data", "data from SecondActivity")
setResult(RESULT_OK, intent)
finish()
}
# 返回键也传输数据
override fun onBackPressed() {
val intent = Intent()
intent.putExtra("data", "data from SecondActivity")
setResult(RESULT_OK, intent)
finish()
super.onBackPressed()
}
}
3.4 Activity的生命周期
3.4.1 返回栈
元素是Activity的栈
3.4.2 Activity状态
a, 运行状态 : 当前运行的界面
b, 暂停状态 : 可见,大部情况不回收
c, 停止状态 : 看情况回收
d, 销毁状态 : 已经回收
3.4.3 Activity的生存期
1, onCreat()
2, onStart()
3, onResume()
4, onPause()
5, onStop()
6, onDestroy()
7. onRestart()
8. onAttachedToWindow()
9. onDetachedFromWindow
打开一个主Activity: 1238
开另一个副Activity: 45
回到一个主Activity: 723
结主一个主Activity: 4569
对话框添加: 在AndroidManifest.xml中Actvitiy的添加如下代码
android:theme="@style/Theme.AppCompat.Dialog"
如果打一个对话框如下:4
结束一个对话框下:3
3.4.4 体验Activity 的生命周期
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
class Main2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i("test","onCreate activity创建")
setContentView(R.layout.activity_main2)
}
override fun onStart() {
super.onStart()
Log.i("test","onStart activity开启")
}
override fun onRestart() {
super.onRestart()
Log.i("test","onRestart activity重新开启")
}
override fun onResume() {
super.onResume()
Log.i("test","onResume activity获得焦点")
}
override fun onStop() {
Log.i("test","onStop activity停止")
super.onStop()
}
override fun onPause() {
Log.i("test","onPause activity暂停")
super.onPause()
}
override fun onDestroy() {
Log.i("test","onDestroy activity摧毁")
super.onDestroy()
}
override fun finish() {
Log.i("test","finish activity结束")
super.finish()
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
Log.i("test","onAttachedToWindow activity添加到界面")
}
override fun onDetachedFromWindow() {
Log.i("test","onDetachedFromWindow 从界面移除")
super.onDetachedFromWindow()
}
override fun onTrimMemory(level: Int) {
Log.i("test","onTrimMemory 手机内存不足回调")
super.onTrimMemory(level)
}
// override override fun onLowMemory() {
// super.onLowMemory()
// }
}
3.4.5 Activity 被回收了怎么办
第一步:在主Activity中添加如下代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i("test","onCreate activity创建")
if (savedInstanceState != null){
val tempData = savedInstanceState!!.getString("data_key")
bundle_data = tempData
if (tempData != null) {
Log.d("test_1 : ", tempData!!)
}
}
}
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
super.onSaveInstanceState(outState, outPersistentState)
val tempData = "Something you just typed ! "
outState.putString("data_key", tempData)
}
3.5 Activity的启动模式
在androidManifest.xml中Activity中添加: android:launchMode="standard"
1, standard
2, singleTop
3, singleTask
4, singleInstance
standard 默认模式
Activity默认的启动模式,不用设置。每次启动Activity都会新建一个实例,即都会执行onCreate方法
singleTop 栈顶复用
当第一次启动Activity时,创建新的实例
当非第一次启动时,如果要启动的Activity在栈顶,则复用。比如从自己的Activity又启动自己的Activity,则复用自己,即复用栈顶。
如果要启动的Activity没在栈顶,则创建新实例
singleTask 栈内复用,并弹出栈
如果要启动的Activity在栈内,则将该Activity上的所有Activity都弹出栈,即其余Activity都会执行onDestroy方法。
singleInstance 单例
上述的三种启动模式都在一个栈内,而singleinstance的Activity都拥有自己独立的栈
3.6 Activity的最佳实践
3.6.1 知晓当前是那一个Activity
其他类,继承这个类
class BaseActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
Log.d("BaseActivity", javaClass.simpleName)
}
}
3.6.2 随时随地退出程序
override fun onDestroy() {
super.onDestroy()
ActivityCollector.removeActivity(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_2)
ActivityCollector.addActivity(this)
button2.setOnClickListener{
Toast.makeText(this, "button_2", Toast.LENGTH_SHORT).show()
ActivityCollector.finishAll()
}
}
# 杀掉当前进程
android.os.Process.killProcess(android.os.Process.myPid())
3.6.3 启动Activity的最佳写法
companion object {
fun actionStart(context1: Context, data1: String, data2: String){
val intent = Intent(context1, MainActivity::class.java)
intent.putExtra("param1", data1)
intent.putExtra("param2", data2)
context1.startActivity(intent)
}
}
actionStart(this, "abc", "efg")
第3章 先从看的到入手,探究Activity(笔记)
最新推荐文章于 2024-08-19 15:54:05 发布