用Service+Broadcast解決倒計時過程中Activity被銷毀的問題

来源:https://www.cnblogs.com/ganchuanpu/archive/2018/05/26/9092845.html
-Advertisement-
Play Games

主要思想是這樣的:將倒計時CountDownTimer放在Service裡面進行,每過一秒就一條發廣播,在主Activity里註冊廣播,收到廣播後更新UI。 一、寫一個類CodeTimerService繼承自Service,重寫onStartCommand(...)方法。 先瞭解一下CountDow ...


主要思想是這樣的:將倒計時CountDownTimer放在Service裡面進行,每過一秒就一條發廣播,在主Activity里註冊廣播,收到廣播後更新UI。

一、寫一個類CodeTimerService繼承自Service,重寫onStartCommand(...)方法。

 1 @Override  
 2     public int onStartCommand(Intent intent, int flags, int startId) {  
 3   
 4         // 第一個參數是總時間, 第二個參數是間隔  
 5         mCodeTimer = new CountDownTimer(60000, 1000) {  
 6             @Override  
 7             public void onTick(long millisUntilFinished) {  
 8                 // 廣播剩餘時間  
 9                 broadcastUpdate(IN_RUNNING, millisUntilFinished / 1000 + "");  
10             }  
11   
12             @Override  
13             public void onFinish() {  
14                 // 廣播倒計時結束  
15                 broadcastUpdate(END_RUNNING);  
16                 // 停止服務  
17                 stopSelf();  
18             }  
19         };  
20         // 開始倒計時  
21         mCodeTimer.start();  
22         return super.onStartCommand(intent, flags, startId);  
23     }  
24   
25     // 發送廣播  
26     private void broadcastUpdate(final String action) {  
27         final Intent intent = new Intent(action);  
28         sendBroadcast(intent);  
29     }  
30   
31     // 發送帶有數據的廣播  
32     private void broadcastUpdate(final String action, String time) {  
33         final Intent intent = new Intent(action);  
34         intent.putExtra("time", time);  
35         sendBroadcast(intent);  
36     }  

先瞭解一下CountDownTimer怎麼用:
創建CountDownTimer實例時傳入兩個參數,第一個參數是總時間, 第二個參數是間隔;需要重寫onTick(long millisUntilFinished)和onFinish()兩個回調方法,前者表示倒計時進行中,後者表示倒計時結束,在方法中寫處理事件;最後調用start()方法開始倒計時。

 

二、在主Activity中註冊廣播,接收廣播,更新UI

// 註冊廣播  
    private static IntentFilter updateIntentFilter() {  
        final IntentFilter intentFilter = new IntentFilter();  
        intentFilter.addAction(RegisterCodeTimerService.IN_RUNNING);  
        intentFilter.addAction(RegisterCodeTimerService.END_RUNNING);  
        return intentFilter;  
    }  
 // 廣播接收者  
    private final BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() {  
        @Override  
        public void onReceive(Context context, Intent intent) {  
            final String action = intent.getAction();  
            switch (action) {  
                case RegisterCodeTimerService.IN_RUNNING:  
                    if (btnCountdown.isEnabled())  
                        btnCountdown.setEnabled(false);  
                    // 正在倒計時  
                    btnCountdown.setText("倒計時中(" + intent.getStringExtra("time") + ")");  
                    Log.e(TAG, "倒計時中(" + intent.getStringExtra("time") + ")");  
                    break;  
                case RegisterCodeTimerService.END_RUNNING:  
                    // 完成倒計時  
                    btnCountdown.setEnabled(true);  
                    btnCountdown.setText(R.string.countdown);  
  
                    break;  
            }  
        }  
    };  
    @Override  
    protected void onResume() {  
        super.onResume();  
        // 註冊廣播  
        registerReceiver(mUpdateReceiver, updateIntentFilter());  
    }  
  
    @Override  
    protected void onPause() {  
        super.onPause();  
        // 移除註冊  
        unregisterReceiver(mUpdateReceiver);  
    }  

最後補上例子的源代碼:跨Activity的倒計時源代碼

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • VirtualBox圖形界面下有四種網路接入方式,它們分別是: 1、NAT 網路地址轉換模式(NAT,Network Address Translation) 2、Bridged Adapter 橋接模式 3、Internal 內部網路模式 4、Host-only Adapter 主機模式 而在Co ...
  • 功能簡介: 操作方法: 溫馨提示: ...
  • 1.首先查看時區:swfsadmin@swfsubuntu:~$ date -RTue, 17 Dec 2013 18:23:01 +0800如果要修改時區,執行sudo tzselect2.選擇區域:亞洲swfsadmin@swfsubuntu:~$ sudo tzselect[sudo] pas ...
  • 使用MySQL 登錄、連接資料庫 win+R打開控制台,cmd進入控制台,輸入 ,後輸入密碼,進入資料庫; 首先可以查看原有的資料庫,輸入 好的,現在開始創建一個新的資料庫,命名為crashcourse, 由於上課時老師提供了兩個sql文件,將sql文件導入資料庫中即可,導入時的語句 ,`sourc ...
  • <!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 --> <property name="acquireIncrement">3</property> <!--定義在從資料庫獲取新連接失敗後重覆嘗試的次數。Default: 30 --> <property nam ...
  • 概念:類似於java的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名 好處:1、隱藏了實現細節 2、提高代碼的重用性 調用:select 函數名(實參列表) 【from 表】; 1、字元函數 1.1、length 獲取參數值的位元組個數 SELECT LENGTH('john'); 1.2、con ...
  • GTID複製典型的複製錯誤有兩種:1,數據對象級別的錯誤,包括主庫上update的數據在從庫上不存在,主從逐漸衝突,庫表索引等對象的衝突等等, 如果是純粹的跳過錯誤的話,這一類的錯誤需要跳過思路是找到主庫binlog中對應的事務Id然後在從庫上跳過即可。2,日誌找不到的錯誤,也即從庫在執行利用主庫上 ...
  • 每個 Android 應用進程在創建時,會同時創建一個線程,我們稱之為主線程,負責更新 UI 界面以及和處理用戶之間的交互,因此,在 Android 中,我們又稱之為 UI 線程。一個進程中 UI 線程只有一個,為了不造成界面卡頓、提高用戶體驗,我們勢必要將一些耗時操作交由子線程來執行。 使用子線程 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...