2013-03-23 111 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

相关问题