2011-09-22 63 views
3

我已阅读了一些文章(以及其他地方),介绍了如何在启动应用程序时动态选择要显示的活动。下面是我的代码:Android:动态选择启动活动并不总是有效

AndroidManifest.xml中

<activity android:name=".StartupActivity" 
      android:theme="@android:style/Theme.NoDisplay"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

StartupActivity.java

public class StartupActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     Intent intent; 
     if (RandomClass.getSomeStaticBoolean()) 
     { 
      intent = new Intent(this, ActivityOften.class); 
     } 
     else 
     { 
      intent = new Intent(this, ActivityRare.class); 
     } 
     startActivity(intent); 
     finish(); 
    } 
} 

两个ActivityOften和ActivityRare都在清单中声明(当然没有发射类别)和扩展ListActivity和活动分别。 99%的时间显示的第一个活动是基于RandomClass.getSomeStaticBoolean()的ActivityOften。

因此,第一次从图标启动我的应用程序时,我在StartupActivity.onCreate内部进行了分解。选择正确。但随后尝试启动应用程序(从快捷方式或应用程序菜单)再次显示ActivityOften。 StartupActivity类内不会出现进一步的中断。尽管我知道RandomClass.getSomeStaticBoolean()已经改变了值并且该ActivityRare应该出现,但第一个活动不断弹出。

任何想法?

谢谢,Merci,Gracias,Danke,Grazie! 肖恩

回答

2

就像一个建议,你可以只有一个活动,而不是三个,通过动态选择内容视图。即

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    if (RandomClass.getSomeStaticBoolean()) 
    { 
     setContentView(R.layout.Often); 

     // Set up often .... 
    } 
    else 
    { 
     setContentView(R.layout.Rare); 

     // Set up rare .... 
    } 
} 

这意味着你必须在活动中写入设置代码两个视图,这可能会有点混乱。

+0

这是可能的,但每个活动类都有很多代码。我会尝试这种方法,但宁愿如果可能不将所有代码混合到一个文件中。感谢您的输入!将保持你的成功呢... –

+1

最后,我决定去用ViewFlipper。 在http://www.androidpeople.com/android-viewflipper-example发现示例 我尝试了上述想法,但在切换视图时,Android引发了异常。有一种方法可以在充气和设置另一个之前删除视图。最终,我去了ViewFlipper。另外,我让我的Activity成为一个单一的实例活动(这样可以避免在打开另一个时打开另一个异常并关闭顶部,然后在堆栈中的下一个控件上使用控件)。 –

3

这是因为您的应用程序活动是从历史堆栈中加载的。 在清单中为ActivityOftenActivityRare设置android:noHistory=true。这应该可以解决你的问题。

+0

为真。使用后,它每次都正确地重新创建。但现在它不再在活动堆栈上,这对我的情况没有太大的帮助。谢谢您的帮助!! –