日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

一、Activity的四種啟動(dòng)模式:

1、standard(標(biāo)準(zhǔn)模式):一個(gè)定義Activity在mainfest中不設(shè)置Android:launchMode=“standard”,也會(huì)默認(rèn)為standard,standard就是新建一個(gè)Activity就在棧中新建一個(gè)Activity實(shí)例。
2、singleTop(棧頂復(fù)用模式):在mainfest中設(shè)置singleTop模式時(shí),當(dāng)前棧頂如果有一個(gè)相同的Activity,就不創(chuàng)建而復(fù)用棧頂?shù)哪莻€(gè),只要?jiǎng)?chuàng)建新的和棧頂相同的Activity才會(huì)復(fù)用,復(fù)用的Activity就回調(diào)onNewIntent方法。
3、singleTask(棧內(nèi)單例模式):當(dāng)前棧內(nèi)只有一個(gè)Activity實(shí)例,棧內(nèi)已存activity實(shí)例,在其他Activity中開啟這個(gè)Activity,Android直接把這個(gè)實(shí)例棧上面的其他Activity實(shí)例踢出棧GC掉。
4、singleInstace(堆內(nèi)單例):設(shè)置該模式的Activity實(shí)例存在一個(gè)單獨(dú)的任務(wù)棧中,整個(gè)系統(tǒng)獨(dú)立的。

設(shè)置了singleTop、singleTask、singleInstance這三種模式的Activity,如果開啟一個(gè)新的Activity頁面,棧頂存在相同的實(shí)例就復(fù)用,都不會(huì)重新創(chuàng)建一個(gè)新實(shí)例,Activity復(fù)用后都會(huì)調(diào)用onNewIntent(Intent intent)方法。

測(cè)試demo例子:
在mainfest清單文件中定義這些Activity

        <activity android:name=".lauchmode.LaunchModeActivity"
            android:launchMode="singleTask"/>
        <activity
            android:name=".lauchmode.StandardActivity"
            android:launchMode="standard" />
        <activity
            android:name=".lauchmode.SingleTopActivity"
            android:launchMode="singleTop" />
        <activity
            android:name=".lauchmode.SingleTaskActivity"
            android:launchMode="singleTask"/>
        <activity android:name=".lauchmode.SingleInstanceActivity"
            android:launchMode="singleInstance"/>
class LaunchModeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityLaunchModeBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btStandard.setOnClickListener {
            startActivity(Intent(this, StandardActivity::class.JAVA))
        }
        binding.btSingleTop.setOnClickListener {
            startActivity(Intent(this, SingleTopActivity::class.java))
        }
        binding.btSingleTask.setOnClickListener {
            startActivity(Intent(this, SingleTaskActivity::class.java))
        }
    }
}

以下就是LaunchModeActivity頁面,下面按鈕分別跳轉(zhuǎn)到StandardActivity 、SingleTopActivity、SingleInstanceActivity、SingleTaskActivity頁面。
在這里插入圖片描述

Java
class StandardActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityStandardBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        binding.btStandard.setOnClickListener {
            startActivity(Intent(this, StandardActivity::class.java))
        }
        binding.btSingleTop.setOnClickListener {
            startActivity(Intent(this, SingleTopActivity::class.java))
        }
        binding.btSingleTask.setOnClickListener {
            startActivity(Intent(this, SingleTaskActivity::class.java))
        }
        binding.btSingleInstance.setOnClickListener {
            startActivity(Intent(this, SingleInstanceActivity::class.java))
        }
    }
}
class SingleTopActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivitySingleTopBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btStandard.setOnClickListener {
            startActivity(Intent(this, StandardActivity::class.java))
        }
        binding.btSingleTop.setOnClickListener {
            startActivity(Intent(this, SingleTopActivity::class.java))
        }
        binding.btSingleTask.setOnClickListener {
            startActivity(Intent(this, SingleTaskActivity::class.java))
        }
        binding.btSingleInstance.setOnClickListener {
            startActivity(Intent(this, SingleInstanceActivity::class.java))
        }
    }
}
class SingleTaskActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivitySingleTaskBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btStandard.setOnClickListener {
            startActivity(Intent(this, StandardActivity::class.java))
        }
        binding.btSingleTop.setOnClickListener {
            startActivity(Intent(this, SingleTopActivity::class.java))
        }
        binding.btSingleTask.setOnClickListener {
            startActivity(Intent(this, SingleTaskActivity::class.java))
        }
        binding.btSingleInstance.setOnClickListener {
            startActivity(Intent(this, SingleInstanceActivity::class.java))
        }
    }
}
class SingleInstanceActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivitySingleInstanceBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btStandard.setOnClickListener {
            startActivity(Intent(this, StandardActivity::class.java))
        }
        binding.btSingleTop.setOnClickListener {
            startActivity(Intent(this, SingleTopActivity::class.java))
        }
        binding.btSingleTask.setOnClickListener {
            startActivity(Intent(this, SingleTaskActivity::class.java))
        }
        binding.btSingleInstance.setOnClickListener {
            startActivity(Intent(this, SingleInstanceActivity::class.java))
        }
    }
}

StandardActivity 、SingleTopActivity、SingleInstanceActivity、SingleTaskActivity這些Activity的頁面都是下圖,方便測(cè)試
在這里插入圖片描述
查看task棧情況指令: adb shell dumpsys activity
1、singleTop模式測(cè)試:
開啟Activity的順序是StandardActivity---->SingleTopActivity---->SingleTopActivity,查看任務(wù)棧可發(fā)現(xiàn),本來是開啟兩個(gè)SingleTopActivity頁面的,但是棧頂只有一個(gè)實(shí)例。
在這里插入圖片描述
2、singleTask模式測(cè)試:
開啟Activity的順序是SingleTaskActivity---->StandardActivity---->SingleTopActivity---->SingleTaskActivity,如下圖任務(wù)棧可發(fā)現(xiàn),本來一共開啟了四個(gè)Activity,最后只剩下一個(gè)SingleTaskActivity,所以設(shè)置了singleTask模式的Activity,在一個(gè)任務(wù)棧中只能有一個(gè)實(shí)例,棧頂不管開多少個(gè)Activity,只要打開設(shè)置了singleTask的Activity后,該Activity上面的Activity都會(huì)銷毀回收掉。
在這里插入圖片描述
3、singleInstance模式測(cè)試:
開啟Activity的順序是StandardActivity---->SingleInstanceActivity---->StandardActivity,然后關(guān)閉頁面順序是這樣的StandardActivity—>StandardActivity---->SingleInstanceActivity,最后關(guān)閉的頁面即然是SingleInstanceActivity,如果再關(guān)閉SingleInstanceActivity頁面就回到手機(jī)的桌面了。所有這個(gè)模式有點(diǎn)特別,設(shè)置了該模式Activity存在在一個(gè)單獨(dú)的任務(wù)棧中。如下圖:
在這里插入圖片描述
4、taskAffinity屬性:
taskAffinity屬性和Activity的啟動(dòng)模式息息相關(guān),而且taskAffinity屬性比較特殊,在普通的開發(fā)中也是鮮有遇到,但是在有些特定場(chǎng)景下卻有著出其不意的效果。
taskAffinity是Activity在mainfest中配置的一個(gè)屬性,暫時(shí)可以理解為:taskAffinity為宿主Activity指定了存放的任務(wù)棧[不同于App中其他的Activity的棧],為activity設(shè)置taskAffinity屬性時(shí)不能和包名相同,因?yàn)锳ndroid團(tuán)隊(duì)為taskAffinity默認(rèn)設(shè)置為包名任務(wù)棧。
taskAffinity只有和SingleTask啟動(dòng)模式匹配使用時(shí),啟動(dòng)的Activity才會(huì)運(yùn)行在名字和taskAffinity相同的任務(wù)棧中。

5、Intent中標(biāo)志位設(shè)置啟動(dòng)模式:
四種模式可以使用代碼中設(shè)置,通過Intent.setFlags(int flags)設(shè)置啟動(dòng)模式。
FLAG_ACTIVITY_CLEAR_TOP : 等同于mainfest中配置的singleTask。
FLAG_ACTIVITY_SINGLE_TOP: 同樣等同于mainfest中配置的singleTop。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 其對(duì)應(yīng)在AndroidManifest中的屬性為android:excludeFromRecents=“true”,當(dāng)用戶按了“最近任務(wù)列表”時(shí)候,該Task不會(huì)出現(xiàn)在最近任務(wù)列表中,可達(dá)到隱藏應(yīng)用的目的。
FLAG_ACTIVITY_NO_HISTORY: 對(duì)應(yīng)在AndroidManifest中的屬性為:android:noHistory=“true”,這個(gè)FLAG啟動(dòng)的Activity,一旦退出,它不會(huì)存在于棧中。

6、設(shè)置FLAG_ACTIVITY_NEW_TASK屬性:
這個(gè)屬性需要在被開啟的目標(biāo)Activity在AndroidManifest.xml文件配置taskAffinity的值(必須和startActivity發(fā)其者Activity的包名不一樣,如果是跳轉(zhuǎn)另一個(gè)App的話可以taskAffinity可以省略),則會(huì)在新標(biāo)記的Affinity所存在的taskAffinity中壓入這個(gè)Activity。

如下面跳轉(zhuǎn)到微信頁面的代碼中,設(shè)置FLAG_ACTIVITY_NEW_TASK后,跳轉(zhuǎn)到微信的時(shí)候會(huì)開啟一個(gè)新的任務(wù)棧存放微信的頁面,如果不設(shè)置就回加入到當(dāng)前的任務(wù)棧中

try {
                val intent = Intent(Intent.ACTION_MAIN)
                val cmp = ComponentName("com.tencent.mm","com.tencent.mm.ui.LauncherUI")
                intent.addCategory(Intent.CATEGORY_LAUNCHER)
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                intent.component = cmp
                startActivity(intent)
            } catch (e: ActivityNotFoundException) {
                Toast.makeText(this,"檢查到您手機(jī)沒有安裝微信,請(qǐng)安裝后使用該功能", Toast.LENGTH_SHORT).show()
            }

如果去掉上面intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)這條代碼,微信的頁面就回加入到自己app的任務(wù)棧中。
在這里插入圖片描述
7、Intent屬性:
在Android中Intent是在四大組件之間進(jìn)行交互與通訊,也可以在應(yīng)用之間通訊。其底層的通信是以Binder機(jī)制實(shí)現(xiàn)的,在物理層則是通過共享內(nèi)存的方式實(shí)現(xiàn)的。Intent的屬性有:component(組件)、action、category、data、type、extras、flags;所有的屬性也是各顯神通,滿足開發(fā)者的各種需要滿足不同場(chǎng)景。
component: 顯然就是設(shè)置四大組件的,將直接使用它指定的組件,借助這一屬性可以實(shí)現(xiàn)不同應(yīng)用組件之間通訊。
action: 是一個(gè)可以指定目標(biāo)組件行為的字符串,開發(fā)人員可以自定義action通過匹配action實(shí)現(xiàn)組件之間的隱士跳轉(zhuǎn),當(dāng)然Android系統(tǒng)也已經(jīng)預(yù)定部分String作為系統(tǒng)應(yīng)用Action,例如打開系統(tǒng)設(shè)置頁面等等。
data: 通常是URI類型或者M(jìn)IME類型格式定義的操作數(shù)據(jù);表示與動(dòng)作要操縱的數(shù)據(jù)。
Category: 屬性用于指定當(dāng)前動(dòng)作(Action)被執(zhí)行的環(huán)境。
type: 對(duì)于data范例的描寫。
extras:extras和flags 這兩個(gè)太熟悉了就不在重復(fù)。

8、Activity的onSaveInstanceState和onRestoreInstanceState方法:
在Android系統(tǒng)內(nèi)存不足時(shí),同時(shí)Activity失去焦點(diǎn)后被系統(tǒng)給回收后,Activity 再次被創(chuàng)建時(shí),通過onSaveInstanceState 和onRestoreInstanceState使用Bundle來存儲(chǔ)恢復(fù)數(shù)據(jù),例如屏幕的橫豎屏切換時(shí),就會(huì)先調(diào)用onSaveInstanceState方法,切換屏幕后的頁面就會(huì)調(diào)用onRestoreInstanceState方法。

分享到:
標(biāo)簽:Android
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定