Android:Control可以追溯到Splash Screen

时间:2013-07-31 04:51:01

标签: android splash

我设计了一个带闪屏的应用程序,睡眠时间为3秒,并显示我的应用程序的主屏幕。我可以无缝导航到我的应用程序,在我回到主屏幕后,当按下后退按钮时,控件再次返回到启动画面,而不是终止应用程序。请给我一个解决方案。 :)

6 个答案:

答案 0 :(得分:7)

由于您尚未发布代码,我猜您没有致电finish();。您可以在onPause()内或在调用新意图之前调用它,就像其他人建议的那样。

<强>更新

如果您只是加载启动画面,则可能只是将参数设置为不将其保留在活动堆栈中。在manifest.xml中,您可以在其中定义您的活动:

<activity android:name=".SplashScreen" android:noHistory="true" ... />

您不需要上课finish()。通常只需拨打startActivity()

请参阅:How to finish current activity in Android

Calling finish() After Starting a New Activity

Start new Activity and finish current one in Android?

希望这会有所帮助。

答案 1 :(得分:2)

在开始新活动之前完成启动活动。您的启动活动的onResume方法可能是这样的:

@Override
protected void onResume() {
    super.onResume();

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            // finish the splash activity so it can't be returned to
            SplashActivity.this.finish();
            // create an Intent that will start the second activity
            Intent mainIntent = new Intent(SplashActivity.this, SecondActivity.class);
            SplashActivity.this.startActivity(mainIntent);
        }
    }, 3000); // 3000 milliseconds
}

答案 2 :(得分:1)

通过添加 android noHistory =“ true ”来更改您的启动活动xml,您就完成了。

<activity
        android:name="com.naveen.example.SplashActivity"
        android:label="@string/app_name"
        android:noHistory="true" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

答案 3 :(得分:0)

在开始之前或让我们说去新活动,完成旧活动,例如:

YourSplashActivity.this.finish();
Intent intent = new Intent(SplashActivity.this, SecondActivity.class);
YourSplashActivity.this.startActivity(intent);

此外,您可以执行以下逻辑:

    // drop application to home activity (to prevent to show Splash)
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

答案 4 :(得分:0)

假设您的启动画面只会在您的应用程序启动后出现一次,并且在应用程序运行完毕后重新启动应用程序之前不再显示(意味着通过按主页按钮退出应用程序不计),为什么不调用finish()覆盖你的启动画面活动的onPause(),如下所示。

@Override
public void onPause() {
    super.onPause();
    finish();
}

这比运行线程或发布Runnable对象以便处理程序要简单得多。我测试了它似乎工作。我不知道这个解决方案是否有任何缺点,但如果有任何问题我忽略了,我希望有人能为我指出。

答案 5 :(得分:0)

仅供记录:使用此处描述的解决方案,您会浪费时间,因为他们会在继续之前暂停初始化2-3秒。

我更喜欢在Splash Screen Layout之上添加main_activity.xml。我通过扩展Application来检测应用程序的第一次启动。如果它是第一次启动,我会在后台构建UI时显示我的Splash-Screen ...(如果ProgressBar滞后,请使用后台线程!)

//Extend Application to save the value. You could also use getter/setter for this instead of Shared Preferences...
public class YourApplication extends Application {

    public static final String YOUR_APP_STARTUP = "APP_FIRST_START";

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

        //set SharedPreference value to true
        SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        SharedPreferences.Editor editor = mPreferences.edit();
        editor.putBoolean(YOUR_APP_STARTUP, true);
        editor.apply();     
        ...    
     }

检查MainActivity

中的第一次开始
public class YourMainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //hide actionbar and other menu which could overlay the splash screen
    getActionBar().hide();

    setContentView(R.layout.activity_main);

    Boolean firstStart = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(TVApplication.YOUR_APP_STARTUP, true);

    if (firstStart) {
        //First app start, show splash screen an hide it after 5000ms
        final RelativeLayout mSplashScreen = (RelativeLayout) findViewById(R.id.splash_screen);
        mSplashScreen.setVisibility(View.VISIBLE);
        mSplashScreen.setAlpha(1.0f);
        final FrameLayout mFrame = (FrameLayout) findViewById(R.id.frame_container);
        mFrame.setAlpha(0.0f);

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Animation fadeOutAnimation = AnimationUtils.loadAnimation(getApplicationContext(),
                        R.anim.fade_out_animation);
                fadeOutAnimation.setDuration(500);
                fadeOutAnimation.setAnimationListener(new Animation.AnimationListener() {

                    @Override
                    public void onAnimationStart(Animation animation) {
                        mFrame.setAlpha(1.0f);
                        getActionBar().show();
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        mSplashScreen.setVisibility(View.GONE);
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {

                    }
                });
                mSplashScreen.startAnimation(fadeOutAnimation);
            }
        }, 5000); //<-- time of Splash Screen shown

    } else {
        ((RelativeLayout) findViewById(R.id.splash_screen)).setVisibility(View.GONE);
        getActionBar().show();
    }

将SplashScreen插入main.xml的顶部。我更喜欢RelativeLayout。在示例中,SplashScreen被放置在Navitgation Drawer的布局上,我们真的很喜欢,不是吗?

//main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <!-- The main content view -->

        <FrameLayout
            android:id="@+id/frame_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <!-- The navigation drawer list -->

        <ListView
            android:id="@+id/slider_list"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_alignParentTop="true"
            android:layout_gravity="start"
            android:background="@color/tvtv_background"
            android:choiceMode="singleChoice"
            android:divider="@drawable/nav_bar_divider"
            android:dividerHeight="1dp"
            android:listSelector="@android:color/transparent" />
    </android.support.v4.widget.DrawerLayout>

    <RelativeLayout
        android:id="@+id/splash_screen"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:background="@color/tvtv_white"
        android:visibility="visible" >

        <ImageView
            android:id="@+id/splash_screen_logo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:paddingLeft="50dp"
            android:paddingRight="50dp"
            android:scaleType="fitCenter"
            android:src="@drawable/ic_launcher" />

        <TextView
            android:id="@+id/splash_screen_text"
            style="@style/TVTextBlueContent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/splash_screen_logo"
            android:layout_centerHorizontal="true"
            android:padding="10dp"
            android:text="Awesome splash shiat" />

        <ProgressBar
            android:id="@+id/splash_screen_loader"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/splash_screen_text"
            android:layout_centerHorizontal="true"
            android:clickable="false"
            android:indeterminate="true" />
    </RelativeLayout>

</RelativeLayout>