Android入門(六) | Activity 的啟動模式 及 生產環境中關于 Activity 的小技巧

文章目錄

  • Activity 的啟動模式
    • standard
    • singleTop
    • singleTask
    • singleInstance
  • 技巧
    • 了解當前界面是哪個 Activity
    • 隨時隨地退出程序
    • 啟動活動的最佳寫法


Activity 的啟動模式

  • standard:默認的啟動方式,每次啟動一個活動都會重新創建
  • singleTop:如果該活動處于棧頂,則不會創建新活動,不處于棧頂則創建新活動
  • singleTask:如果返回棧中存在該活動,那么將該活動之上的所有活動統統出棧,將該活動置于棧頂,如果不存在該活動則創建
  • singleInstance:會重新啟用一個新的返回棧來創建該活動,通常用于共享活動的實例

standard

standard 是 Activity 默認的啟動模式,在不進行顯式指定的情況下,都使用這種模式。

在本模式下,每當啟動一個新的活動,系統不會確認返回棧中是否已存在這個活動,而是直接創建該活動的一個新的實例并入棧。

在這里插入圖片描述


singleTop

如果啟動活動時發現返回棧棧頂已經是這個活動,則認為可以直接使用它,不會創建新的實例。

AndroidManifest.xml 中添加如下配置:
在這里插入圖片描述
在這里插入圖片描述


singleTask

每次啟動該活動時,系統首先會在返回棧中檢查是否存在該活動的實例:

  • 如果發現已經存在則直接使用該實例,并把在這個活動之上的活動統統出棧;
  • 如果沒有就創建新的實例。

舉個例子:

  1. 我們為 FirstActivity 配置 singleTask ;
  2. 然后在 FirstActivity 的 Button 上啟動 SecondActivity
  3. 然后 SecondActivity 的 Button 上回到 FirstActivity
    在這里插入圖片描述

我們可以得到這樣的推斷:

  1. SecondActivity 中啟動 FirstActivity 時,會發現返回棧中已經存在一個 FirstActivity 的實例;
  2. 于是 SecondActivity 會從返回棧中出棧,而 FirstActivity 重新成為了棧頂活動;
  3. 因此 FirstActivity 的 onRestart()方法 和 SecondActivity 的 onDestroy() 方法會得到執行。

singleInstance

在本模式下,活動會啟用一個新的返回棧來管理(如果 singleTask 模式指定了不同的 taskAffinity,也會啟動一個新的返回棧)。如果我們想實現其他程序和我們的程序可以共享某個活動的實例,就可以用 singleInstance 模式創建一個單獨的返回棧來管理這個活動,以此實現讓任意應用程序都可以調用該活動。

舉個例子:

  • FirstActivity 通過 Button 跳轉到 SecondActivity
  • SecondActivity 通過 Button 跳轉到 ThirdActivity,且修改 SecondActivity 的啟動模式為 singleInstance
<activity android:name=".SecondActivity" android:launchMode="singleInstance">

倘若我們通過 log 來監測三個活動分屬的返回棧,我們會發現:
在這里插入圖片描述
SecondActivity 是存放在一個單獨的返回棧里的。

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

原理很簡單:

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

在這里插入圖片描述


技巧

了解當前界面是哪個 Activity

新建一個普通 java 類 —— BaseActivity

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

然后讓每個活動類都改為繼承自 BaseActivity,這樣就可以在 LogCat 中看到當前類名。


隨時隨地退出程序

當在程序運行中的一個活動,要退出可能會需要按多次 Back 鍵(按 Home 鍵只是把程序掛起,并沒有退出程序。),所以需要一個直接退出活動的方法。

新建一個 ActivityCollector 類作為活動管理器:

public class ActivityCollector {public static List<Activity> activities = new ArrayList<Activity>();public static void addActivity(Activity activity){ // 用于向 List 中添加一個 Activityactivities.add(activity);}public static void removeActivity(Activity activity){ // 用于從 List 中刪除一個 Activityactivities.remove(activity);}public static void finishAll(){ // 用于將 List 中存儲的所有活動全部銷毀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);// 將當前正在創建的活動添加到活動管理器 ActivityCollector 里}@Overrideprotected void onDestroy(){super.onDestroy();ActivityCollector.removeActivity(this);// 將一個馬上要銷毀的活動從管理器 ActivityCollector 中移除}
}

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

保險起見也可以在銷毀所有活動后殺掉當前進程,以保證程序完全退出:

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

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


啟動活動的最佳寫法

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

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

這樣雖然可以,但是在 SecondActivity 是一個黑盒子時,是會出現問題的。可以修改 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 的構建,而非 onClick() 方法,所有 SecondActivity 中需要的數據都是通過 actionStart() 方法的參數傳遞過來的,然后把它們存儲到 Intent 中,最后調用 startActivity() 方法啟動。

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443710.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android入門(七) | 常用控件

文章目錄TextView 控件&#xff1a;文本信息Button 控件&#xff1a;按鈕EditText 控件&#xff1a;輸入框ImageView 控件&#xff1a;圖片ProgressBar 控件&#xff1a;進度條AlertDialog 控件&#xff1a;提示框ProgressDialog 控件&#xff1a;帶有進度條的提示框TextView 控…

Android入門(八) | 常用的界面布局 及 自定義控件

文章目錄LinearLayout &#xff1a;線性布局android:layout_gravity &#xff1a;控件的對齊方式android:layout_weight&#xff1a;權重RelativeLayout &#xff1a;相對布局相對于父布局進行定位相對于控件進行定位邊緣對齊FrameLayout &#xff1a;幀布局Percent &#xff1…

Android入門(九)| 滾動控件 ListView 與 RecyclerView

文章目錄ListView內置類型的簡單運用定制數據類型提升效率點擊事件RecyclerView布局管理器點擊事件ListView 內置類型的簡單運用 由于手機屏幕空間有限&#xff0c;能夠一次性在屏幕上顯示的內容不多&#xff0c;當我們的程序有大量數據需要顯示的時候就可以借助 ListView 來…

關于“三門問題”的一些想法

三門問題&#xff08;Monty Hall problem&#xff09;亦稱為蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論&#xff0c;大致出自美國的電視游戲節目Let’s Make a Deal。問題名字來自該節目的主持人蒙提霍爾&#xff08;Monty Hall&#xff09;。參賽者會看見三扇關閉了的門&#xf…

Android入門(10)| Fragment碎片詳解

文章目錄為什么要使用碎片&#xff08;Fragment&#xff09;實例布局文件FragmentActivity動態添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期為什么要使用碎片&#xff08;Fragment&#xff09; 我們在手機上看新聞可能是這樣的&#xff1a; Re…

Android開發(1) | Fragment 的應用——新聞應用

文章目錄Item&#xff1a;標題子項布局文件Java代碼標題碎片布局文件Java代碼新聞內容碎片布局文件Java代碼新聞內容活動布局文件Java代碼首界面布局文件Java代碼Item&#xff1a;標題子項 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Java Web整體異常處理

在實際的J2EE項目中&#xff0c;系統內部難免會出現一些異常&#xff0c;就如StrutsSpringHibernate項目&#xff1a;通常一個頁面請求到達后臺以后&#xff0c;首先是到action&#xff08;就是MVC中的controller&#xff09;&#xff0c;在action層會調用業務邏輯層service&am…

Android入門(11)| 全局廣播與本地廣播

文章目錄廣播概念接收廣播動態注冊實例靜態注冊實例發送廣播發送標準廣播廣播的跨進程特性發送有序廣播本地廣播廣播概念 Android 中的每個應用程序都可以對自己感興趣的廣播進行注冊&#xff0c;這樣該程序就只會接收到自己所關心的廣播內容&#xff0c;這些廣播可能是來自系…

Android開發(2) | 廣播 Broadcast 的應用——強制下線功能

文章目錄功能簡介關閉所有活動登陸界面發送強制下線的廣播廣播接收器AndroidManifest.xml運行結果功能簡介 強制下線功能只需要彈出一個對話框&#xff0c;讓用戶只能點擊確定按鈕&#xff0c;回到登錄界面。 如果在每一個活動中添加一個對話框的話太過繁瑣&#xff0c;用廣播…

Android入門(12)| 數據持久化

文章目錄數據持久化文件存儲將數據存儲進文件實例從文件中讀取數據實例SharedPreferences存儲將數據存儲進文件實例從文件中讀取數據實例實現記住密碼的功能SQLite數據庫存儲創建自己的幫助類調用自己的幫助類補全 onUpgrade() 方法增刪查改增&#xff1a;SQLiteDatabase.inser…

Android入門(13)| Android權限 與 內容提供器

文章目錄普通權限與危險權限運行時申請權限內容提供器運用安卓封裝好的內容提供器自實現的內容提供器概念實現普通權限與危險權限 主要用于不同應用程序之間在保證被訪數據的安全性的基礎上&#xff0c;實現數據共享的功能。 在 Android 6.0 開始引入了運行時權限的功能&…

Java實現身份證號碼的驗證,JAVA后臺驗證身份證號碼

代碼如下&#xff1a; package cn.gov.csrc.util;/*** 18 位身份證驗證器* * author admin* */ public class IDCard {final int[] wi { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };final int[] vi { 1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2 };private int[] ai n…

Android入門(14)| 通知

文章目錄創建通知點擊效果其它小功能實例創建通知 創建通知的步驟&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通過當前 Context 的 getSystemService() 獲取實例。它接受一個字符串參數用于確定獲取系統的什么服務。Android 8.0(O) 版本后需要通知通道&…

Android開發(3) | 權限和內容提供器的應用——調用相機和相冊

文章目錄拍照并保存到 ImageView 控件布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作隱式 Intent 啟動后的回調AndroidManifest.xml從相冊選取照片并在 ImageView 控件中顯示布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作自定義打開相冊的方法 op…

Android開發(4) | 系統權限、MediaPlayer類 和 VideoView類 的應用——播放多媒體文件

文章目錄MediaPlayer類播放音頻的實例VideoView類播放視頻的實例MediaPlayer類 對多種格式的音頻文件提供了全面的控制方法&#xff1a; 如何獲得MediaPlayer實例&#xff1f; 通過構造函數&#xff1a; MediaPlayer mp new MediaPlayer();調用 MediaPlayer.create() 方法&…

Android入門(15)| 網絡

文章目錄WebViewHTTP使用HttpURLConnection使用OkHttp封裝網絡操作封裝HttpURLConnection封裝OkHttpWebView WebView 可以在 應用程序中&#xff08;而不是瀏覽器&#xff09; 展示一些網頁。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Java-單例模式

單例模式相信大家都不陌生&#xff0c;在JAVAEE應用中&#xff0c;單例模式是一種應用非常廣泛的設計模式&#xff0c;應用中許多組件都只需要單個實例&#xff0c;下面介紹單例模式。 使用單例模式的優點&#xff1a; 1.減少創建JAVA實例所帶來的系統開銷。 2.便于系統跟蹤單…

Android入門(16)| 服務

文章目錄概念Android 多線程繼承 Thread繼承 Runable 接口匿名類異步消息處理AsyncTask使用服務框架啟動/停止服務綁定/解綁服務服務的生命周期前臺服務IntentService完整版下載示例下載過程的回調接口&#xff1a;DownloadListener繼承 AsyncTask 實現下載功能&#xff1a;Dow…

2020德勤面試開始了嗎_2020國考面試開始,近期面試公告匯總,附結構化小組面試流程...

2020年國家公務員考試面試環節逐步恢復考試&#xff0c;各個招錄部門已經發布面試考察公告&#xff0c;對于進入面試環節的國考考生來說&#xff0c;有必要了解近期國考面試的招錄動態&#xff0c;提前做好面試準備。2020國考國家統計局機關面試面試確認&#xff1a;請進入面試…

項目積壓需求項目計劃_需求變更頻繁,項目經理如何做好需求管理?

項目實施過程中&#xff0c;項目經理常常面臨一個重大挑戰——需求變更。需求變更無處不在&#xff0c;市場條件變化、新業務出現、戰略目標調整、客戶需求修改、資源限制等&#xff0c;都會造成需求變更。需求變更會影響項目的時間、成本和質量&#xff0c;對整個項目和團隊成…