日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧

發(fā)布時(shí)間:2023/12/13 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • Activity 的啟動(dòng)模式
    • standard
    • singleTop
    • singleTask
    • singleInstance
  • 技巧
    • 了解當(dāng)前界面是哪個(gè) Activity
    • 隨時(shí)隨地退出程序
    • 啟動(dòng)活動(dòng)的最佳寫法


Activity 的啟動(dòng)模式

  • standard:默認(rèn)的啟動(dòng)方式,每次啟動(dòng)一個(gè)活動(dòng)都會(huì)重新創(chuàng)建
  • singleTop:如果該活動(dòng)處于棧頂,則不會(huì)創(chuàng)建新活動(dòng),不處于棧頂則創(chuàng)建新活動(dòng)
  • singleTask:如果返回棧中存在該活動(dòng),那么將該活動(dòng)之上的所有活動(dòng)統(tǒng)統(tǒng)出棧,將該活動(dòng)置于棧頂,如果不存在該活動(dòng)則創(chuàng)建
  • singleInstance:會(huì)重新啟用一個(gè)新的返回棧來創(chuàng)建該活動(dòng),通常用于共享活動(dòng)的實(shí)例

standard

standard 是 Activity 默認(rèn)的啟動(dòng)模式,在不進(jìn)行顯式指定的情況下,都使用這種模式。

在本模式下,每當(dāng)啟動(dòng)一個(gè)新的活動(dòng),系統(tǒng)不會(huì)確認(rèn)返回棧中是否已存在這個(gè)活動(dòng),而是直接創(chuàng)建該活動(dòng)的一個(gè)新的實(shí)例并入棧。


singleTop

如果啟動(dòng)活動(dòng)時(shí)發(fā)現(xiàn)返回棧棧頂已經(jīng)是這個(gè)活動(dòng),則認(rèn)為可以直接使用它,不會(huì)創(chuàng)建新的實(shí)例。

在 AndroidManifest.xml 中添加如下配置:


singleTask

每次啟動(dòng)該活動(dòng)時(shí),系統(tǒng)首先會(huì)在返回棧中檢查是否存在該活動(dòng)的實(shí)例:

  • 如果發(fā)現(xiàn)已經(jīng)存在則直接使用該實(shí)例,并把在這個(gè)活動(dòng)之上的活動(dòng)統(tǒng)統(tǒng)出棧;
  • 如果沒有就創(chuàng)建新的實(shí)例。

舉個(gè)例子:

  • 我們?yōu)?FirstActivity 配置 singleTask ;
  • 然后在 FirstActivity 的 Button 上啟動(dòng) SecondActivity
  • 然后 SecondActivity 的 Button 上回到 FirstActivity
  • 我們可以得到這樣的推斷:

  • SecondActivity 中啟動(dòng) FirstActivity 時(shí),會(huì)發(fā)現(xiàn)返回棧中已經(jīng)存在一個(gè) FirstActivity 的實(shí)例;
  • 于是 SecondActivity 會(huì)從返回棧中出棧,而 FirstActivity 重新成為了棧頂活動(dòng);
  • 因此 FirstActivity 的 onRestart()方法 和 SecondActivity 的 onDestroy() 方法會(huì)得到執(zhí)行。

  • singleInstance

    在本模式下,活動(dòng)會(huì)啟用一個(gè)新的返回棧來管理(如果 singleTask 模式指定了不同的 taskAffinity,也會(huì)啟動(dòng)一個(gè)新的返回棧)。如果我們想實(shí)現(xiàn)其他程序和我們的程序可以共享某個(gè)活動(dòng)的實(shí)例,就可以用 singleInstance 模式創(chuàng)建一個(gè)單獨(dú)的返回棧來管理這個(gè)活動(dòng),以此實(shí)現(xiàn)讓任意應(yīng)用程序都可以調(diào)用該活動(dòng)。

    舉個(gè)例子:

    • FirstActivity 通過 Button 跳轉(zhuǎn)到 SecondActivity
    • SecondActivity 通過 Button 跳轉(zhuǎn)到 ThirdActivity,且修改 SecondActivity 的啟動(dòng)模式為 singleInstance:
    <activity android:name=".SecondActivity" android:launchMode="singleInstance">

    倘若我們通過 log 來監(jiān)測三個(gè)活動(dòng)分屬的返回棧,我們會(huì)發(fā)現(xiàn):

    SecondActivity 是存放在一個(gè)單獨(dú)的返回棧里的。

    而在 ThirdActivity 中按 Back 鍵,那么會(huì)直接返回到 FirstActivity,再按下返回鍵會(huì)回到 SecondActivity,再按下返回鍵才會(huì)退出程序。

    原理很簡單:

    • 由于 FirstActivityThirdActivity 是存放在同一個(gè)返回棧里的,當(dāng)在 ThirdActivity 的界面按下 Back 鍵, ThirdActivity 會(huì)從返回棧中出棧,那么 FirstActivity 就成為了棧頂活動(dòng)顯示在界面上。
    • 然后在 FirstActivity 界面再次按下 Back 鍵,這時(shí)當(dāng)前的返回棧已經(jīng)空了,于是就顯示了另一個(gè)返回棧的棧頂活動(dòng),即 SecondActivity
    • 最后再次按下 Back 鍵,這時(shí)所有返回棧都已經(jīng)空了,也就自然退出了程序。


    技巧

    了解當(dāng)前界面是哪個(gè) Activity

    新建一個(gè)普通 java 類 —— BaseActivity

    public class BaseActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);Log.d("BaseActivity", getClass().getSimpleName());} }

    然后讓每個(gè)活動(dòng)類都改為繼承自 BaseActivity,這樣就可以在 LogCat 中看到當(dāng)前類名。


    隨時(shí)隨地退出程序

    當(dāng)在程序運(yùn)行中的一個(gè)活動(dòng),要退出可能會(huì)需要按多次 Back 鍵(按 Home 鍵只是把程序掛起,并沒有退出程序。),所以需要一個(gè)直接退出活動(dòng)的方法。

    新建一個(gè) ActivityCollector 類作為活動(dòng)管理器:

    public class ActivityCollector {public static List<Activity> activities = new ArrayList<Activity>();public static void addActivity(Activity activity){ // 用于向 List 中添加一個(gè) Activityactivities.add(activity);}public static void removeActivity(Activity activity){ // 用于從 List 中刪除一個(gè) Activityactivities.remove(activity);}public static void finishAll(){ // 用于將 List 中存儲(chǔ)的所有活動(dòng)全部銷毀for (Activity activity : activities)if (!activity.isFinishing())activity.finish();} }

    接下來修改 BaseActivity

    public class BaseActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);Log.d("BaseActivity", getClass().getSimpleName());ActivityCollector.addActivity(this);// 將當(dāng)前正在創(chuàng)建的活動(dòng)添加到活動(dòng)管理器 ActivityCollector 里}@Overrideprotected void onDestroy(){super.onDestroy();ActivityCollector.removeActivity(this);// 將一個(gè)馬上要銷毀的活動(dòng)從管理器 ActivityCollector 中移除} }

    以后,不管想在什么地方退出程序,只需要 ActivityCollector.finishAll() 就可以了。

    保險(xiǎn)起見也可以在銷毀所有活動(dòng)后殺掉當(dāng)前進(jìn)程,以保證程序完全退出:

    android.os.Process.killProcess(android.os.Process.myPid());

    killProcess() 方法用于殺掉一個(gè)進(jìn)程,它接收一個(gè)進(jìn)程 id 參數(shù),通過 myPid() 方法來獲得當(dāng)前程序的進(jìn)程 id。需要注意的是 killProcess() 方法只能用于殺掉當(dāng)前程序的進(jìn)程,我們不能使用這個(gè)方法去殺掉其他程序。


    啟動(dòng)活動(dòng)的最佳寫法

    之前啟動(dòng)的方法是構(gòu)建一個(gè)新的 Intent,然后調(diào)用 startActivity() 或者 startActivityForResult() 來啟動(dòng)活動(dòng)。如果 SecondActivity 需要用到兩個(gè)字符串參數(shù),那么 FirstActivity 可能會(huì)寫成下面這樣:

    Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("extra_data1", s1); intent.putExtra("extra_data2", s2); startActivity(intent);

    這樣雖然可以,但是在 SecondActivity 是一個(gè)黑盒子時(shí),是會(huì)出現(xiàn)問題的。可以修改 SecondActivity 的代碼:

    public static void actionStart(Context context, String s1, String s2){Intent intent = new Intent(context, SecondActivity.class);intent.putExtra("extra_data1", s1);intent.putExtra("extra_data2", s2);context.startActivity(intent); }

    和以往不同,在 actionStart() 方法中完成了 Intent 的構(gòu)建,而非 onClick() 方法,所有 SecondActivity 中需要的數(shù)據(jù)都是通過 actionStart() 方法的參數(shù)傳遞過來的,然后把它們存儲(chǔ)到 Intent 中,最后調(diào)用 startActivity() 方法啟動(dòng)。

    這樣在 onClick() 方法中只需一行代碼即可啟動(dòng) SecondActivity

    button1.setOnclickListener(new OnclickListener() {@Overridepublic void onclick(View v) {SecondActivity.actionStart(FirstActivity.this, "data1", "data2");} });

    總結(jié)

    以上是生活随笔為你收集整理的Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。