Android-заставка для класса «Приложение» - PullRequest
5 голосов
/ 30 сентября 2010

У меня есть приложение для Android, в котором я расширил базовый класс Application для настройки некоторых глобальных переменных.

public class MyApplication extends Application {

 private ArrayList<ModelClass> master_list; // global variable 1
 private DataBaseHelper db_helper; // global variable 2

 @Override
 public void onCreate() {
  super.onCreate();
  //do database work that will take about 5 seconds
 }
}

Я хотел бы показать заставку пользователю, пока приложениекласс работает (т. е. до создания моей основной деятельности).Есть ли способ сделать это?

Ответы [ 4 ]

5 голосов
/ 30 сентября 2010

Вы можете сделать SplashActivity своей начальной активностью.

Когда MyApplication завершит свою работу, вы можете начать свою основную деятельность и избавиться от заставки.

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

public class SplashActivity extends Activity
    @override
    protected void onResume() {
    //Create a thread
    new Thread(new Runnable() {
            public void run() {
                //Do heavy work in background
                ((MyApplication)getApplication()).loadFromDb();
                startActivity(new Intent(SplashActivity.this, MainActivity.class));
                finish(); //End this activity
            }
        }).start();
    }
}
3 голосов
/ 01 октября 2010

Способ, которым я делаю это в своих приложениях, заключается в том, чтобы ваша основная деятельность расширяла ActivityGroup.

public class App extends ActivityGroup {
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.splashscreen);
        new Thread(new Runnable() {
            public void run() {
                // do your loading here
                final LocalActivityManager lam = getLocalActivityManager();
                runOnUiThread(new Runnable() {
                    public void run() {
                        Intent mainIntent = new Intent(MainActivity.class, App.this);
                        Window w = lam.startActivity("main", mainIntent);
                        setContentView(w.getDecorView());
                    }
                }
            }
        }, "App loading thread").start();
    }
}

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

Я на самом деле использую это, чтобы убедиться, что пользователь вошел в систему при запуске приложения, и если комбинация имени пользователя и пароля неправильная, я не запускаюОсновное приложение, но экран входа в систему:)

0 голосов
/ 10 октября 2012

Я понимаю, что это довольно далеко после того, как об этом спросили, но я надеюсь, что кто-то найдет это полезным, и я предоставлю код, если это необходимо. Мой подход состоял в том, чтобы создать публичное логическое значение в классе приложения с именем «doneLoading». Я запускаю приложение в виде активности на экране-заставке, и каждые 250 миллисекунд я проверяю, есть ли в поле FinishLoading = true и когда это происходит, я запускаю новую операцию. Еще одна приятная деталь в том, что у меня есть небольшая полоса прогресса, так что пользователь видит что-то происходящее и анимацию вокруг.

0 голосов
/ 30 сентября 2010

Во-первых, я думаю, что есть много подходов к созданию заставки.Интуитивно понятно, что у меня не было бы специального класса / вида деятельности только для загрузки конкретной информации, потому что для того, чтобы сохранить эту информацию, вам нужно будет поддерживать активность и активность где-то, занимая ресурсы.Это просто макет, который изначально загружается с помощью onCreate () основного действия, а затем, как только информация БД загружается, измените свой макет на макет основных действий.1006 *

...