Android: управление возвращается на заставку

Я разработал приложение с заставкой, которая спит () в течение 3 секунд и отображает домашний экран моего приложения. Я могу легко перейти в свое приложение, и после того, как я вернусь на главный экран, когда нажата кнопка "Назад", элемент управления снова возвращается на экран-заставку, а не завершает приложение. Пожалуйста, дайте мне решение.:)

6 ответов

Решение

Закончите всплеск активности, прежде чем начинать новый. 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
}

Так как вы не разместили код, я думаю, вы не звонили finish();, Вы можете назвать это внутри вашего onPause() или перед вызовом нового намерения, как предложили другие.

Обновить

Если вы просто загружаете заставку, вы можете просто установить параметр, чтобы он не сохранялся в стеке активности. В файле manifest.xml, где вы определяете свою деятельность, выполните:

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

Вы не будете требовать к классу finish(), Просто нормально звони startActivity(),

Смотрите: Как закончить текущую активность в Android

Вызов метода finish() после начала нового действия

Начать новую активность и закончить текущую в Android?

Надеюсь это поможет.

Измените ваш всплеск активности xml, как показано ниже, добавив android: noHistory = " true ", и все готово.

<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>

Для справки: с решениями, описанными здесь, вы теряете время, потому что они приостанавливают инициализацию на 2-3 секунды, прежде чем продолжить.

Я предпочитаю добавить Splash Screen Layout на вершине моего main_activity.xml, Я обнаруживаю первый запуск приложения, расширяя Приложение. Если это первый запуск, я показываю свой 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>   

Прежде чем начать или, скажем, перейти к новому действию, завершите старое действие, например:

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);

Предполагая, что ваш заставка появится только один раз, когда ваше приложение запускается и не будет отображаться снова, пока вы не перезапустите приложение после того, как приложение завершит работу (то есть выход из приложения нажатием кнопки home не считается), почему бы не вызвать финиш () при переопределении onPause() вашей активности на заставке, как показано ниже.

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

Это намного проще, чем запуск потока или публикация объекта Runnable для обработки обработчиком. Я проверил это, и это похоже на работу. Я не знаю, есть ли какой-либо недостаток в этом решении, но если есть какая-то проблема, которую я упустил, я бы хотел, чтобы кто-то указал мне на это.

Другие вопросы по тегам