2013-04-29 182 views
4

我有一個應用程序需要在某人退出其主要活動時呼叫完成(因此我不希望它是暫停),即使按家庭活動必須完成,爲了處理這個問題,我現在只需在我的onPause()方法中調用finish(),因爲一切都是用碎片完成的,它工作得很好,並且沒有任何穩定性問題。在onPause()內調用finish()但在方向改變時不會調用

我唯一的問題是,我不能處理方向的變化,因爲onPause()被之前調用(讓我禁用旋轉時出現這種情況)。

我可以創建一個服務來處理這個問題,但它的方式很複雜。

有什麼想法?

+0

每次啓動應用程序時,是否要在MainActivity上啓動應用程序?也就是說,如果您的應用程序處於活動B並且用戶按下了主鍵,那麼當應用程序再次啓動時,它會從MainActivity開始而不是活動B? – 2013-04-29 08:35:34

+0

如果在onStop()之前調用'onConfigurationChanged()',則可以在其中調用'finish()'。 – rciovati 2013-04-29 09:03:36

+0

@HoanNguyen沒有活動B我只有一個活動 – JohnUopini 2013-04-29 13:42:07

回答

7

您可以使用onWindowFocusChanged事件,而不是onPause。當方向改變時這個函數不被調用。

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    Log.d(TAG, "FOCUS = " + hasFocus); 
    if (!hasFocus) finish(); 
} 

但要注意:此事件被稱爲活動時仍然可見(如在onPause()),你應該 如果你想完成的活動使用的onStop當它是真的,完全看不見:

private boolean isInFocus = false; 

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    Log.d(TAG, "FOCUS = " + hasFocus); 
    isInFocus = hasFocus; 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if (!isInFocus) finish(); 
} 
+0

呃,看起來不錯,讓我試試! – JohnUopini 2013-04-29 09:05:33

+0

感謝您解決我的問題 - 我想找到一種方法來區分應用程序最小化和方向更改。 – 2013-10-17 13:30:08

0

從你的問題來看,你似乎只有一個活動,在這種情況下,你應該在清單中設置一個標誌。在您的MainActivity清單中添加

android:clearTaskOnLaunch="true" 
+0

謝謝Hoan,這將清除啓動時的活動,但它不會在退出時完成它,因爲我需要重新啓動一個服務並在退出時釋放一些內存,我需要在退出時完成。 – JohnUopini 2013-04-29 08:57:30

+0

爲什麼你不能在onStop()中調用finish()? – 2013-04-29 09:29:53

+0

如果您只是暫停活動,並且我想在暫停期間完成,則不會調用onStop() – JohnUopini 2013-04-29 13:43:45

0

你可以聆聽方位的變化,並在變化事件存儲有關它一個布爾值,像

boolean orientationChanging; 

使這個真實的取向時變,虛假事後,比在你的onPause:

@Override 
protected void onPause() { 

    if(!orientationChanging){ 
       finish(); 
      } 
} 
+0

由於onConfigurationChanged永遠不會被調用(onPause被首先調用),所以這不起作用。 – JohnUopini 2013-04-29 08:58:26

3

其簡單的只是做:

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

     display = ((WindowManager) getSystemService(WINDOW_SERVICE)) 
       .getDefaultDisplay(); 
     orientation = display.getOrientation(); 

    } 

@Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 

     int orientation_ = display.getOrientation(); 
     if (orientation_ != orientation) { 
      finish(); 
     } 
     Log.e("hello=---->", "onPause"); 
     super.onPause(); 
    } 
相關問題