使用intent
隐式INTENT用法
跳转到拨号键盘
val intent=Intent(Intent.ACTION_VIEW)
intent.data=Uri.parse("tel:10086")
startActivity(intent)
向下一个activity传输数据
val data="Hello theSecondActivity"
val intent=Intent(this,SecondActivity::class.java)
intent.putExtra("extra_data",data)
startActivity(intent)
val extraData=intent.getStringExtra("extra_data")
Log.d("secondActivity get ","extra_data $extraData")
返回数据传给上一个activity
- 同样另外一个启动activity 的类 startActivityForResult(intent 请求码)
- 在被启动activity中设置传入(可以绑定到按钮或者onbackPressed类中)的intent, 同时要设置setResult(Result_Ok, intent)
- 在销毁后会调用上一个的onActivityResult函数,只需要重写该函数即可
Activity的生命周期
返回栈
activity 的状态: 运行 暂停 停止 销毁
activity的生命周期
- onCreate 在创建的时候调用,用来初始化一些东西 完整生存期
- onStart 由不可见变为可见状态的时候调用 可见生存期
- onResume 交互的时候调用前台生存期
- onPause 启动另外一个activity的时候调用前台生存期
- onStop 在activity完全不可见的时候调用,(如果启动的是新的activity而且是对话框形式的话,会使用onPause)可见生存期
- onDestory 被销毁的时候调用 完整生存期
- onRestart 由停止状态变为运行状态的时候调用
Activity被回收了怎么办?
可能会将原有的信息销毁,这时候需要使用
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
super.onSaveInstanceState(outState, outPersistentState)
outState.putString("datakey","something you just typed")
}
在销毁前会调用,只需要将信息保存在bundle类型的outstate中,而在创建的时候会调用onCreate方法,其中也有bundle类型的参数,主要将其中的数据提取出来即可
启动activity的方式
在Androidmanifest中设置
launchMode=“模式”
- standard 每次启动新的activity都会在返回栈中创建新的实例
- singTop 每次启动前都会检查是否返回栈栈顶第一个是要启动的实例,如果是则不会新创建
- singTask 每次都会检查栈中是否已经存在了
- singleInstance 所有的程序调用同一个activity,为该activity创建一个单独的activity返回栈.
如果B是共享的返回栈,AC在同一个返回栈中,则A → \rightarrow → B → \rightarrow → C 跳转中, 点击返回会发现 C → \rightarrow →A → \rightarrow →B
Activity时间
知晓现在是哪一个activity
重写onCreate的父类,使其被继承
打印下该实例的信息即可知道
open class BaseActivity:AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("BaseActivity",javaClass.simpleName)
}
}
立即退出程序
- 创建一个类ActivityCollector,用来管理类的集合
- 在baseActivity中重写onCreate ,将新创建的类加入其中;重写onDestory删除该实例
- 在使用的时候即可直接调用ActivityCollector将全部的类删除
也可以直接使用 ,直接杀死程序
android.os.Process.killProcess(android.os.Process.myPid())
启动activity的最佳写法
在secondActivity中写入
class SecondActivity : BaseActivity() {
companion object{
fun actionStart(context: Context,data1:String,data2:String){
val intent=Intent(context,SecondActivity::class.java)
intent.putExtra("param1",data1)
intent.putExtra("param2",data2)
context.startActivity(intent)
}
}
}
而在Firstactivity中调用
button1.setOnClickListener{
SecondActivity.actionStart(this,"zhang","san")
}
kotlin标准函数和静态方法
with 对象 lambda
lambad中会提供对象的环境
val l= listOf<String>("a","b","c")
val w=with (StringBuilder()){
append("context")
for(i in l){
append(i)
}
toString()
}
println(w)
run 对象.run{lambda表达式}
同上
apply 对象.apply{lambda}(最后一行和上面俩个不一样,不会有返回值)
val intent=Intent(context,SecondAcitivity::class.java).apply{
putExtra("param1","data1"
...
}
定义静态方法
静态方法就是不需要创建实例即可直接调用的方法,在Java中static关键字,而在Kotlin中需要创建单例类
object util{
fun dosomething(){
println("do something")
}
}
util.dosomething()
但是该方法会将其全部变为静态方法,正确的做法可以加一个companion object{},该方法会生成一个伴生类, 若是强制性转化为静态类,可以使用注释@JvmStatic
class util{
fun dosomething(){
println("do something")
}
companion object{
@JvmStatic
fun dosomething2(){
println("do something2")
}
}
}
或者使用顶层方法,直接定义一个函数在单独的文件夹中
fun dosomething3(){
println("do something3")
}