0

我的应用程序中实际上有 3 个活动。

我刚刚创建了一个活动,并使用处理程序将其作为 SPLASH SCREEN。

即,我的启动画面出现 3 秒,然后应用程序的主要生命周期继续。至此,一切都很完美。

我的问题是当启动画面加载时,如果我改变方向,整个应用程序崩溃。

我的要求是以横向和纵向模式加载应用程序。

我已经尝试过 onConfig 更改等,但徒劳无功....

我的悲伤故事都包含在这里......

    public class Asplash extends Activity{
Handler handler = new Handler();

   @Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);

    try {

        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub


                finish();
                Intent i = new Intent(Asplash.this, Example.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(i);
            }
        }, 3000);

    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }

}




  @Override
protected void onPause() {
    // TODO Auto-generated method stub
     handler.removeCallbacksAndMessages(null);
       finish();
    super.onPause();

}
}

这是清单文件:

     <activity android:name=".Asplash"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
        android:configChanges="orientation">
        <intent-filter >
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>


    <activity
        android:name="com.example.Example"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

我只想制作这个“Asplash”活动,以横向和纵向显示。我还尝试在 LAYOUT 和 LAYOUT-LAND 文件夹中为“splash”创建 XML 文件。然后也是同样的恐慌......

实际上在ANDROID中,它应该像基本示例一样自动调整方向变化。但我不明白为什么它在这里不起作用......

4

5 回答 5

4

使用此代码:

public class Asplash extends Activity{

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        startLoading();
    }
    //Start new activity and finish splash activity
    public void openMainActivity() {
        Intent i = new Intent(Asplash.this, Example.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
         startActivity(i);
         finish();
    }
    //Start thread which will wait for 3 secs and call openMainActivity
    private void startLoading(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                }
                openMainActivity();
            }
        }).start();
    }
}

finish() 应该在打开新活动后调用。并尝试此代码,它将解决您的问题。您无需对清单进行任何更改。

于 2013-03-06T13:06:39.300 回答
0

尝试将以下一个放在您manifestactivity错误中:

   android:configChanges="orientation"

正如Android 文档所说:

安卓:配置更改

列出activity将自行处理的配置更改。当运行时发生配置更改时,activity默认情况下会关闭并重新启动,但使用此属性声明配置将阻止活动重新启动。相反,activity仍然运行并onConfigurationChanged()调用其方法。

于 2013-03-06T12:58:37.293 回答
0

尝试添加 android manifest 文件

    android:configChanges="orientation|screenSize".

但是,如果您的应用程序以 API 级别 12 或更低级别为目标,那么您的 Activity 始终会自行处理此配置更改(此配置更改不会重新启动您的 Activity,即使在 Android 3.2 或更高版本的设备上运行时也是如此)。

于 2013-03-06T13:05:31.673 回答
0

在这种情况下我不确定,但是如果您显示的代码是完整的,那么您的 Runnable 的上下文在它运行时已经消失,因为您的 Activity 在此期间由于方向更改而被破坏并重新创建.

已创建 Activity -> 将自身作为上下文创建 Runnable -> 方向更改 -> Activity 被销毁 -> Activity 被创建 -> Runnable 正在执行 -> Runnable 的上下文对象无效

为了在这个非常简单的情况下解决这个问题,我认为您可以使用 Application 对象作为 RUNnable 的上下文。

但是,请注意您还有另一个问题,即您的 Activity 的重新创建会启动另一个 Runnable,它会做同样的事情,只是稍后。

对于这种低复杂度的场景,一个简单的解决方案可能是在派生的 Application 对象中存储对 Runnable 的引用并检查它是否存在。

于 2013-03-06T13:06:38.073 回答
0

尝试在您的清单中为您遇到错误的活动放置以下一个:

   android:configChanges="orientation"

to the activity tag and then override onConfigurationChanged method and do something like this 

    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
        if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE)
        {

                  load your xml file for landscape
}


else
{
 load your xml file for potrait
}
于 2013-03-06T13:07:48.790 回答