首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 判斷應用是否在前台顯示:避免後台彈出 Toast

     編輯:程式設計綜合問答

問題場景

WebView 加載進度通過 Toast 顯示,但用戶按 Home 鍵或跳轉其他 Activity 後,App 進入後台仍持續彈出 Toast,干擾用戶體驗。

解決方案:Activity 生命周期標記法

利用 onStart() / onStop() 維護一個標誌位 isForeground,僅在前台時顯示 Toast。

實現代碼

public class MainActivity extends AppCompatActivity {
    private boolean isForeground = false;
    private Toast progressToast;

    @Override
    protected void onStart() {
        super.onStart();
        isForeground = true;
    }

    @Override
    protected void onStop() {
        super.onStop();
        isForeground = false;
    }

    private void showProgress(int progress) {
        if (!isForeground) return; // 後台直接返回

        if (progressToast == null) {
            progressToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
        }
        progressToast.setText("Loading... " + progress + "%");
        progressToast.show();
    }

    // WebChromeClient 中調用
    webView.setWebChromeClient(new WebChromeClient() {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            showProgress(newProgress);
        }
    });
}

進階方案:Application.ActivityLifecycleCallbacks(全局監聽)

若多 Activity 需共享前台狀態,可在 Application 中註冊回調:

public class MyApp extends Application {
    private int activityStartCount = 0;
    public boolean isAppForeground() { return activityStartCount > 0; }

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override public void onActivityStarted(Activity a) {
                if (++activityStartCount == 1) { /* App 進入前台 */ }
            }
            @Override public void onActivityStopped(Activity a) {
                if (--activityStartCount == 0) { /* App 進入後台 */ }
            }
            // 其他方法留空...
        });
    }
}

// 任意處調用
if (((MyApp)getApplication()).isAppForeground()) { showToast(); }

避坑提示

  • onPause() 不能判斷後台,因 Activity 切換也會觸發。
  • isFinishing() 僅表示 Activity 正在銷毀,不代表 App 退出。
  • Android 10+ 限制後台 Toast,建議改用 Snackbar 或應用內浮層。

正確識別前後台狀態,能避免不必要的 UI 干擾,提升應用專業度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved