Как запустить действие только один раз, как заставка

В моем приложении я хотел бы запускать экран-заставку только один раз при первом запуске, но проблема в том, что я уже поместил в Manifest эту строку: android:noHistory="true", которая отлично работает, если я нажму кнопку «Назад» и выйду из приложения, но обратите внимание, что приложение все еще работает в фоновом режиме, и когда я нажимаю значок приложения, он снова возвращается к экрану-заставке, а затем к моей странице регистрации. Я хотел, чтобы меня сразу перенаправляли на страницу регистрации, когда я снова открываю свое приложение.

Как мне это сделать? Заранее спасибо за любые предложения.


person Compaq LE2202x    schedule 04.09.2013    source источник
comment
использовать общие настройки. stackoverflow.com/questions/8779929/   -  person Raghunandan    schedule 04.09.2013
comment
используйте общее предпочтение, чтобы установить любое логическое значение, и создайте класс, подобный appstart, в этом случае получите значение общего предпочтения, если оно истинно, затем запустите намерение для SplashScreen, а если ложно, запустите намерение для страницы регистрации.   -  person Narayan Soni    schedule 04.09.2013
comment
Как вы представляете экран-заставку? Вы должны отключить эту загрузку в методе onResume.   -  person g00dy    schedule 04.09.2013
comment
@Compaq LE2202x-вставьте свой код, что вы пробовали ...   -  person FarhaSameer786    schedule 04.09.2013
comment
@Raghunandan Спасибо за ссылку, но на самом деле я ее не понимаю. Должен ли я поместить onActivityResult в свою активность Splash или активность регистрации? Я пробовал оба варианта, но мне показалось, что onActivityResult ни в каком случае не вызывается?   -  person Compaq LE2202x    schedule 04.09.2013
comment
@FarhaSameer786 Я обновил и опубликовал свой код   -  person Compaq LE2202x    schedule 05.09.2013


Ответы (5)


Вот как я этого добился! Надеюсь, это поможет!

import android.app.Activity;

import android.content.Intent;

import android.content.SharedPreferences;

import android.os.Bundle;

public class check extends Activity{

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

    SharedPreferences settings=getSharedPreferences("prefs",0);
    boolean firstRun=settings.getBoolean("firstRun",false);
    if(firstRun==false)//if running for first time
    //Splash will load for first time
    {
        SharedPreferences.Editor editor=settings.edit();
        editor.putBoolean("firstRun",true);
        editor.commit();
        Intent i=new Intent(check.this,Splash.class);
        startActivity(i);
        finish();
    }
    else
    {

        Intent a=new Intent(check.this,Main.class);
        startActivity(a);
        finish();
    }
}

}
person Akshay Mathur    schedule 17.02.2014
comment
Вместо вызова finish() для активности. Чтобы удалить активность из стека активности, просто используйте android:noHistory=true в своем манифесте. - person pratham kesarkar; 04.02.2017
comment
очень просто и очень полезно! Большое спасибо - person Haya Akkad; 13.03.2019

Вы можете использовать Shared Preferences, чтобы сохранить некоторое логическое значение при запуске приложения при первом запуске, а затем проверять это значение при каждом запуске, если происходит выход, а затем напрямую запускать действие регистрации.

Хотя этот подход простого сохранения нормального значения имеет лазейку, где, предположим, ваше приложение установлено на пользовательском устройстве, и пользователь только что обновил приложение новой версией, не удаляя первую, тогда в этом случае вы также не увидите Splash так как старые общие настройки уже будут там с этим старым сохраненным значением.

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

Взгляните на это: Как создать одноразовый экран приветствия с использованием настроек Android?

person Mohit    schedule 04.09.2013
comment
Спасибо за это, я буду использовать это позже, но сейчас у меня все еще есть проблема с запуском один раз. - person Compaq LE2202x; 05.09.2013

Чтобы уточнить упоминание «общих настроек», я считаю, что следующее будет работать, если вы вставите его в onCreate() своей основной деятельности:

    SharedPreferences settings = this.getSharedPreferences("appInfo", 0);
    boolean firstTime = settings.getBoolean("first_time", true);
    if (firstTime) {
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean("first_time", false);
        editor.commit();
    }

После выполнения блока «firstTime» должно указывать, был ли это первый запуск приложения. Я полагаю, что «appInfo» — это просто имя-заполнитель для того, что вы хотите, чтобы файл настроек назывался.

person Erhannis    schedule 04.09.2013
comment
@ CompaqLE2202x Извините; пропустил это - я тоже ненавижу, когда люди так делают. ctx обозначает контекст (действие также является контекстом), который в onCreate() должен быть this. - person Erhannis; 07.09.2013

Итак, вот что я сделал в своей SplashActivity(onCreate):

    SharedPreferences settings = getSharedPreferences("prefs", 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean("firstRun", true);
    editor.commit();

    Intent intent = new Intent(this, RegistrationActivity.class);
    startActivity(intent);

SplashActivity(onResume):

@Override
public void onResume() {
    super.onResume();
    SharedPreferences settings = getSharedPreferences("prefs", 0);
    boolean firstRun = settings.getBoolean("firstRun", true);
    if (!firstRun) {
        Intent intent = new Intent(this, RegistrationActivity.class);
            startActivity(intent);
        Log.d("TAG1", "firstRun(false): " + Boolean.valueOf(firstRun).toString());
    } else {
        Log.d("TAG1", "firstRun(true): " + Boolean.valueOf(firstRun).toString());
    }
}

В моем RegistrationActivity (onCreate):

    SharedPreferences settings = getSharedPreferences("prefs", 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean("firstRun", false);
    editor.commit();

    boolean firstRun = settings.getBoolean("firstRun", true);
    Log.d("TAG1", "firstRun: " + Boolean.valueOf(firstRun).toString());

А затем отключите кнопку «Назад», чтобы предотвратить возврат, если пользователь не нажмет «Домой»:

@Override
public void onBackPressed() {
}

Большое спасибо тем, кто внес свой вклад!

person Compaq LE2202x    schedule 05.09.2013

Проще всего использовать android:noHistory="true" в файле манифеста.

person user3487666    schedule 14.06.2016
comment
Это не работает после того, как приложение было закрыто и открыто снова. - person Amal lal T L; 03.04.2018
comment
android:noHistory="true" только гарантирует, что активность заставки не останется в заднем стеке, но не гарантирует, что активность заставки больше не будет OnCtreate(d). - person Ash; 14.02.2019