WebView 加載進度通過 Toast 顯示,但用戶按 Home 鍵或跳轉其他 Activity 後,App 進入後台仍持續彈出 Toast,干擾用戶體驗。
利用 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);
}
});
}
若多 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 退出。Snackbar 或應用內浮層。正確識別前後台狀態,能避免不必要的 UI 干擾,提升應用專業度。