5

區分我有三個活動: - SplashActivity - MainActivity - PlayerActivity推「回家」按鈕,打開另一個活動

過程中的應用與SplashActivity開始,那麼它開始MainActivity和關閉。 MainActivity在某個時刻啓動PlayerActivity並進入後臺堆棧。 (MainActivity是活着的,但是onStop) 然後,我需要打開MainActivity並將PlayerActivity設置爲背景(PlayerActivity處於活動狀態,但是onStop)。 然後我需要再次打開PlayerActivity並將MainActivity設置爲背景。

因此,當應用程序切換到另一個應用程序時,PlayerActivity和MainActivity通常會在沒有onDestroy的情況下獲取onPause()和onStop()。

我需要完成所有活動,並且每次用戶按下「home」按鈕時啓動SplashActivity的應用程序,但Home按鈕與活動(onPause()和onStop())之間的切換相同。所以我無法抓住差異來殺死活動。

請幫忙。

編輯: 不幸的是,onUserLeaveHint沒有幫助,這是相同的。 如果用戶按下HOME此呼籲:

onUserInteraction, onUserLeaveHint, 的onPause, 的onStop

本次活動無任何用戶操作返回先前的活動(主)。

公共類PlayerActivity延伸活動{

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_next); 

    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      startActivity(new Intent(PlayerActivity.this, MyActivity.class)); 
     } 
    }, 5000); 
} 

}

但仍然有相同的:

onUserInteraction, onUserLeaveHint, 的onPause, 的onStop

+0

降'SplashActivity ',如果你什麼都不做。 – 2014-10-29 00:08:39

+1

正好相反,應用程序在SplashActivity中做了很多工作,所以我需要它,並且我需要在用戶使用主頁按鈕摺疊應用程序時隨時啓動SplashActivity。 – 2014-10-29 00:16:02

回答

2

據我所知,沒有辦法覆蓋主頁按鈕或監聽主頁按鈕按下事件。

然而,你的目標是讓應用程序知道當發生以下情況採取行動:

  • 你的活動都不是顯示 - >您的一個活動時表示。

發生這種情況時,您想要顯示一個啓動對話框。

您可以跟蹤用戶何時進入您的應用程序,並檢查用戶是否從您的應用程序導航到您的活動。

更新:如下例所示,您可以使用ActivityLifecycleCallbacks對象來知道何時調用任何活動的生命週期回調,而不是修改所有活動。你可以拿我的例子並修改它。我相信ActivityLifecycleCallbacks.onActivityStarted()是在super.onStart()調用之後調用的,因此您必須在調用Activity.onStart()中的super.onStart()之前檢查cameFromMyApplication()。這不太容易出錯並且需要更少的代碼。

修改How to check if activity is in foreground or in visible background?,以適應這個問題

實現自定義的應用程序類:

public class MyApplication extends Application { 

    public static boolean cameFromMyApplication() { 
    return count != 0; 
    } 

    public static void activityStarted() { 
    count++; 
    } 

    public static void activityStopped() { 
    count--; 
    } 

    private static int count; 
} 

註冊應用程序類AndroidManifest。XML:

<application 
    android:name="your.app.package.MyApplication" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" > 

添加在onStart和的onStop每一個活動項目(您可能 爲您的活動的共同祖先,如果你想):

@Override 
protected void onStart() { 
    super.onStart(); 
    //Do not include this check in the splash screen Activity 
    if(!MyApplication.cameFromMyApplication()) { 
    //User arrived from outside the application 
    //Application specific code (clear Activity backstack & show splash screen in your case) 
    } 
    MyApplication.activityStarted(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    MyApplication.activityStopped(); 
} 
+0

我看,這不是我希望的方式,但它只是一個工程。萬分感謝! – 2014-10-29 12:18:28

+0

太好了。有一點需要注意:您需要在所有活動中調用activityStarted/activityStopped。我更新了答案。 – vman 2014-10-30 17:32:27

+0

謝謝,對我來說很完美。 – jose920405 2016-09-07 18:48:24

1

您可以通過覆蓋onUserLeavesHint()函數捕獲「主頁按鈕單擊」,這可能足以滿足您的需求。從http://developer.android.com/reference/android/app/Activity.html#onUserLeaveHint()

保護無效onUserLeaveHint()

調用作爲活動生命週期的一部分

@Override 
public void onUserLeaveHint() { 
    super.onUserLeaveHint(); 
    // Do your thing 
} 

文檔當活動即將 進入背景作爲用戶選擇的結果。例如,當 用戶按Home鍵時,onUserLeaveHint()將被調用,但 當來電呼叫導致呼叫中的Activity被自動帶到前臺 時,onUserLeaveHint()將不會被呼叫 活動被中斷。在被調用的情況下, 在活動的onPause()回調之前調用此方法。

此回調和onUserInteraction()旨在幫助 智能管理狀態欄通知活動;具體而言,爲幫助活動確定取消通知的適當時間,請致電 。

+0

tnx,但不幸的是它沒有幫助,請參閱我的編輯 – 2014-10-29 00:56:40

1

你可以這樣查看:

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
List<RunningTaskInfo> tasks = am.getRunningTasks(1); 
    // check if home was pressed 
    if (tasks.get(0).topActivity.getPackageName().equals("com.android.launcher")) { 
     // HOME button pressed 
    } else { 
     // RECENT APPS pressed (you can listen for the key event before) 
     // activity with FLAG_ACTIVITY_NEW_TASK started 
     // etc. 
    } 
0

我一直在尋找通過ungalcrys提供一個解決類似的問題和上面的代碼把我在正確的方向所以這裏的問題,任何人都更通用的解決方案需要它的

@Override 
protected void onStop() { 
     super.onStop(); 

     ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1); 

     // check if the app is still visible 
     if (!tasks.get(0).topActivity.getPackageName().equals(getPackageName())) { 
      // for some reason(HOME, BACK, RECENT APPS, etc.) the app is no longer visible 
      // do your thing here 
      } else { 
      // app is still visible, switched to other activity 
     } 
    } 
相關問題