Android四大组件之Activity

基本概念

  • 一种可以包含用户界面的组件,主要用于和用户进行交互

一 使用Intent在Activity之间进行穿梭

Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。

  1. 显式Intent
button.setOnClickListener{
    val intent = Intent(this, SecondActivity::class.java)
    startActivity(intent)
}
  1. 隐式Intent
  • 通过在<activity>标签下配置<intent-filter>的内容,可以指定当前Activity能够响应的actioncategory
<activity
     android:name=".activity.PswLoginActivity">
    <intent-filter>
              <action android:name="com.meizu.account.outlib.login" />
              <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
  • 在<action>标签中指明了当前PswLoginActivity可以响应com.meizu.account.outlib.login这个action。
  • 而<category>标签则包含了一些附加信息,更精确的指明了当前Activity能够响应的Intent中还可能带有的category。
  • 只有<action><category>中的内容同时匹配Intent中指定的action和category时,这个Activity才能响应该Intent。
  • 每个Intent中只能指定一个action,但能指定多个category。
button.setOnClickListener{
    val intent = Intent("com.meizu.account.outlib.login")
    intent.addCategory("com.meizu.account.outlib.MY_CATEGORY")
    startActivity(intent)
}
//相应的 <action>标签对里面也要指定
<activity
     android:name=".activity.PswLoginActivity">
    <intent-filter>
              <action android:name="com.meizu.account.outlib.login" />
              <category android:name="android.intent.category.DEFAULT" />
              <category android:name="com.meizu.account.outlib.MY_CATEGORY" />
    </intent-filter>
</activity>

还可以在<intent-filter>标签中再配置一个<data>标签,用于更精准地指定当前Activity能够响应的数据

  • android:scheme: 用于指定数据的协议部分,例如https
  • android:host: 用于指定数据的主机名部分,例如www.baidu.com
  • android:port: 用于指定数据的端口部分,一般紧随主机名之后
    只有当<data>标签中指定的内容和Intent中携带的Data完全一致,当前Activity才能响应该Intent
<activity
    android:name=".activity.PswLoginActivity">
   <intent-filter>
             <action android:name="com.meizu.account.outlib.login" />
             <category android:name="android.intent.category.DEFAULT" />
             <data android:scheme="https" />
   </intent-filter>
</activity>

调用响应:

button.setOnClickListener{
   val intent = Intent("com.meizu.account.outlib.login")
   //默认category是DEFAULT
   intent.data = Uri.parse("https:www.baidu.com")
   startActivity(intent)
}

二 Activity之间传递传递与回传

  • 通过Intent传递数据给下一个Activity
  • 通过startActivityForResult(intent,requestCode)启动另一个Activity
  • 另一个Activity通过setResult(resultCode,intent)返回数据
  • 复写onActivityResult方法,通过requestCode判断是哪个Activity跳回来的,通过resultCode判断处理结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?){
    super.onActivityResult(requestCode, resultCode, data)
    when(requestCode){
        1 -> if(resultCode == RESULT_OK){
            val returnData = data?.getStringExtra("...")
        }
    }
}

三 Activity的生命周期

  1. onCreate() : 在Activity第一次被创建的时候调用
  2. onStart() : 在Activity从不可见变为可见的时候调用,还不能交互
  3. onResume() : Activity准备好和用户进行交互的时候调用,此时Activity一定位于返回栈的栈顶,并且处于运行状态
  4. onPause() : 这个方法在系统准备去启动或者恢复另一个Activity的时候调用,此时Activity还处于可见状态不可交互
  5. onStop() : 在Activity完全不可见的时候调用
  6. onDestroy() : 在Activity被销毁之前调用
  7. onRestart() : 在Activity由停止状态变为运行状态之前调用,也就是Activity被重新启动了


    Activity生命周期图

Activity被回收了怎么办

比如MainActivity中有一个文本输入框,现输入了一段文字,然后启动另一个Activity,这时由于系统内存不足MainActivity被回收掉了,过一会你又点击了Back键回到MainActivity,会发现刚刚输入的文字都没了,因为MainActivity被重新创建了。
如果出现这种情况是比较影响用户体验的,为此Android提供了onSaveInstanceState()方法。

override fun onSaveInstanceState(outState: Bundle?){
    super.onSaveInstanceState(outState)
    val tempData = "..."
    outState.putString("key", tempData)
}
override fun onCreate(saveInstanceState: Bundle?){
    super.onCreate(saveInstanceState)
    if(saveInstanceState != null){
        val tempData = saveInstanceState.getString("key")
        ...
    }
}

四 Activity的启动模式

Android是使用返回栈来管理Activity的

  • standard: 每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置,也是Activity的默认启动方式。
  • singleTop: 指定此模式启动,在启动Activity时如果发现返回栈的栈顶已经是该Activity,则会复用当前Activity,如果当前Activity并未处于栈顶,则还是会创建新的实例。
  • singleTask: 指定此模式启动,系统首先会在返回栈中检查是否存在该Activity实例,如果发现已经存在并且位于栈顶,则会复用该Activity实例,如果不在栈顶则会把这个Activity之上的所有其它Activity统统出栈,如果没有则创建该实例。
  • singleInstance: 在这种模式下,会有一个单独的返回栈来管理这个Activity,不管的哪一个应用程序来访问这个Activity,都会共用同一个返回栈,每一个应用程序都会有自己的返回栈,保证该实例全局唯一性。

补充:随时随地退出程序 Activity管理类

object ActivityManager{
    private val activities = ArrayList<Activity>()

    fun addActivity(activity: Activity){
        activities.add(activity)
    }

    fun removeActivity(activity: Activity){
        activities.remove(activity)
    }

    fun finishAll(){
        for(activity in activities){
            if(!activity.isFinishing()){
                activity.finish()
            }
        }
        activities.clear()
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容