Activity

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































	
	


	

	
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值