2013-03-23 109 views
0

在給定的活動中,AlertDialog會將用戶帶入WiFI設置。然後,用戶按下後退按鈕返回到所述活動。一旦按下返回按鈕,立即進行方法調用(Android)

但是,只要後退按鈕被按下,我需要進行方法調用。請注意,我不能簡單地將該方法添加到活動中的以下代碼之後,因爲這會影響用戶必須與AlertDialog實例交互的時間。

只要從WIFI設置菜單中按下後退按鈕,就需要進行方法調用。請告訴我如何執行此操作。

下面是代碼:

alertDialog.setPositiveButton("Settings", new dialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); 
      startActivity(intent); 
     } 
    }); 

回答

1

可以Override呼叫ActivityonResume()方法。當用戶按下「後退」buttononResume()方法肯定會被調用,所以你應該能夠把你的方法調用在這裏

+0

在執行AlertDialog代碼之前調用onResume()方法,因爲這是正常的Android Activity LifeCycle(即Activity開始 - > onCreate() - > onStart() - > onResume())。我需要在執行AlertDialog代碼後發生方法調用。 – androideka 2013-03-23 03:01:52

+0

我瞭解Android生命週期,但根據您的需要,您可以設置一個標誌,以根據何時調用onResume()調用某些代碼 – codeMagic 2013-03-23 03:05:25

+0

對您的想法有所瞭解。它現在有效,謝謝。 – androideka 2013-03-23 03:24:31

0
private boolean inwifisettings; 

public void onClick(DialogInterface dialog, int which) { 
    Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); 
    inwifisettings = true; 
    startActivity(intent); 
} 

@Override public void onWindowFocusChanged(boolean hasFocus) 
{ 
    if(inwifisettings & hasFocus) 
    { 
     doSomething(); 
     inwifisettings = false; 
    } 
} 

你不應該使用的onResume()或startActivityForResult()/ onActivityResult()用於此目的。引述Android文檔:http://developer.android.com/reference/android/app/Activity.html

公共無效startActivityForResult(意向意圖,詮釋requestCode,捆綁選項)
注意,此方法只能與被定義爲返回一個結果意向協議來使用。在其他協議(如ACTION_MAIN或ACTION_VIEW)中,如果您期望,可能無法獲得結果。例如,如果您正在啓動的活動使用singleTask啓動模式,它將不會在您的任務中運行,因此您將立即收到取消結果。

公共無效onWindowFocusChanged(布爾hasFocus)
這是該活動是否對用戶可見的最佳指標。
系統可能會顯示系統級窗口(例如狀態欄通知面板或系統警報),該窗口將臨時採用窗口輸入焦點,而不會暫停前臺活動。

+0

請注意,基於onActivityResult()的解決方案只能工作,只要Wifi設置對話框的launchMode在將來的Android版本中永遠不會改變,基於onResume()的解決方案假定Wifi Settings對話框將暫停您的活動。 Android平臺也不保證。 onWindowFocusChanged是處理這個問題的正確方法。 – 2013-03-23 02:27:25

+0

不會改變,否則startActivityForResult將毫無用處。該方法的名稱說明了這一切,人們會期待迴歸。 – 2013-03-23 02:46:03

+0

ACTION_WIFI_SETTINGS不記錄爲返回結果。你不應該依賴沒有記錄的實現細節,特別是平臺團隊中沒有人會期望任何人依賴的東西。 – 2013-03-23 02:52:56

1

類成員

private static final int WIFI_REQUEST = 1234; 

使用startActivityForResult

alertDialog.setPositiveButton("Settings", new dialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); 
     startActivityForResult(intent, WIFI_REQUEST); 
    } 
}); 

在活動課

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) 
{ 
    super.onActivityResult(requestCode, resultCode, intent); 

    switch (requestCode) 
    { 
     case WIFI_REQUEST: 
       // Call your method here 
       break; 
    } 
} 
+0

無法保證Wifi Settings對話框始終在您的任務中啓動,並且如果生成的活動在其自己的任務中啓動,則會在startActivity()後立即調用onActivityResult()。請參閱下面的onWindowFocusChanged解決方案。 – 2013-03-23 02:28:54

+0

是的,如果你調用startActivityForResult,你可以保證在onResume之前有OS調用onActivityResult。我剛剛測試了onResow後調用onWindowFocusChanged。 – 2013-03-23 02:43:40

+0

儘管您錯過了這一點 - 如果將來Wifi Settings對話框具有不同的launchMode(singleInstance,也許),那麼onActivityResult將立即被調用,而不用等待用戶離開對話框。由於Wifi Settings對話框沒有記錄爲返回結果,因此不應依賴其launchMode與此解決方案保持兼容。 – 2013-03-23 02:51:02

相關問題