中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中應用前后臺切換監聽的實現詳解

發布時間:2020-10-08 14:54:58 來源:腳本之家 閱讀:265 作者:TAKWOLF 欄目:移動開發

前言

最近在工作中遇到了這么一個需求:如何實現 Android 應用前后臺切換的監聽?下面來一起看看詳細的介紹:

iOS 內邊是可以實現的,AppDelegate 給了一個回調監聽:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
 func applicationWillResignActive(_ application: UIApplication) {
 // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
 // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
 }
 func applicationDidEnterBackground(_ application: UIApplication) {
 // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
 // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
 }
 func applicationWillEnterForeground(_ application: UIApplication) {
 // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
 }
 func applicationDidBecomeActive(_ application: UIApplication) {
 // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
 }
}

我保留了系統注釋。一個iOS應用周期,大概的流程是這樣的。

應用從前臺進入到后臺:

applicationWillResignActive() -> applicationDidEnterBackground()

應用從后臺恢復到前臺:

applicationWillEnterForeground() -> applicationDidBecomeActive()

Android 中也存在 Application,但是并沒有提供前后臺切換的監聽。

倒不如說,在 Android 中,壓根就沒有應用前后臺的概念。

Android 中基本頁面單位是 Activity。

Activity 有自己的生命周期,但是 Application 卻沒有一個整體的生命周期。

我們可以通過監聽 Activity 的生命周期,來模擬實現一個 Application 的生命周期。

Activity 的生命周期不在闡述,寫過 Android 的都應該知道。

我們假設現在有兩個 Activity 分別是 A 和 B,A 是啟動頁面,那么生命周期回調是這樣的:(我們忽略掉一些不關心的回調)

A 被啟動或者 A 進入前臺

A.onStart()
A.onResume()

從 A 跳轉到 B:

A.onPause()
B.onStart()
B.onResume()
A.onStop()

從 B 返回 A:

B.onPause()
A.onStart()
A.onResume()
B.onStop()

A 被關閉或者 A 進入后臺

A.onPause()
A.onStop()

注意上面兩個頁面回調的啟動順序。

onResume 和 onPause 是一組,兩個頁面之間是順序調用。

onStart 和 onStop 是一組,兩個頁面之間是交叉調用。

也就是說,A 啟動到 B,會先調用 B.onStart() ,然后再調用 A.onStop() ;而 B 返回 A 則是相反的,會先調用 A.onStart() ,然后再調用 B.onStop()

利用這個特性,我們可以做一個全局計數器,來記錄前臺頁面的數量,在所有 Activity.onStart() 中計數器 +1,在所有 Activity.onStop() 中計數器 -1。計數器數目大于0,說明應用在前臺;計數器數目等于0,說明應用在后臺。計數器從1變成0,說明應用從前臺進入后臺;計數器從0變成1,說明應用從后臺進入前臺。

有了思路,我們來實現。

Application 提供了一個監聽器用于監聽整個應用中 Activity 聲明周期:Application.ActivityLifecycleCallbacks

這個監聽器要求 API >= 14。對應 API < 14 的情況,可以通過編寫一個 BaseActivity,然后讓所有的 Activity 都集成這個類來實現整個應用 Activity 聲明周期的監聽,效果是相同的。

API >= 14,實現如下:

public class ApplicationListener implements Application.ActivityLifecycleCallbacks {
 private int foregroundCount = 0; // 位于前臺的 Activity 的數目
 @Override
 public void onActivityStarted(final Activity activity) {
  if (foregroundCount <= 0) {
   // TODO 這里處理從后臺恢復到前臺的邏輯
  }
  foregroundCount++;
 }
 @Override
 public void onActivityStopped(Activity activity) {
  foregroundCount--;
  if (foregroundCount <= 0) {
   // TODO 這里處理從前臺進入到后臺的邏輯
  }
 }
 /*
  * 下面回調,我們都不需要
  */
 @Override
 public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
 @Override
 public void onActivityResumed(Activity activity) {}
 @Override
 public void onActivityPaused(Activity activity) {}
 @Override
 public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
 @Override
 public void onActivityDestroyed(Activity activity) {}
}

我們在 Application 中注冊這個監聽器來發揮效果:

public class MyApplication extends Application {
 @Override
 public void onCreate() {
  super.onCreate();
  registerActivityLifecycleCallbacks(new ApplicationListener());
 }
}

對于 API < 14 的情況,BaseActivity 實現如下:

public class BaseActivity extends AppCompatActivity {
 private static int foregroundCount = 0; // 注意是個靜態變量
 @Override
 protected void onStart() {
  super.onStart();
  if (foregroundCount <= 0) {
   // TODO 這里處理從后臺恢復到前臺的邏輯
  }
  foregroundCount++;
 }
 @Override
 protected void onStop() {
  foregroundCount--;
  if (foregroundCount <= 0) {
   // TODO 這里處理從前臺進入到后臺的邏輯
  }
  super.onStop();
 }
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄浦区| 昌都县| 剑河县| 清镇市| 曲麻莱县| 丰台区| 隆子县| 西盟| 玉田县| 格尔木市| 吉林省| 太仓市| 德昌县| 平泉县| 宁南县| 龙江县| 灵石县| 合江县| 拉孜县| 青河县| 三江| 堆龙德庆县| 临安市| 蓬溪县| 桂阳县| 泰宁县| 上犹县| 连州市| 墨竹工卡县| 崇礼县| 太白县| 鄂尔多斯市| 无棣县| 建平县| 黄平县| 巫山县| 平谷区| 巴南区| 左贡县| 钦州市| 高陵县|