Android-приложение против активности - PullRequest
13 голосов
/ 21 июля 2011

Я написал несколько приложений для Android и всегда объявлял начальный Activity как:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Было бы замечательно использовать некоторые глобальные методы, статику, общие префы и т. Д., Если бы я мог запустить свое приложение, используя Application, которое затем вызывает первый Activity из его onCreate() после настройки префсов и т. Д., но я не смог найти никаких примеров этого шаблона проектирования ... когда я пробую это в коде, я получаю ClassCastException:

public class MyApplication extends Application {
@Override
    public void onCreate() {
        super.onCreate();

        // do stuff (prefs, etc)

        // start the initial Activity
        Intent i = new Intent(this, InitialActivity.class);
    startActivity(i);
    }
}

InitialActivity.class действительно Activity, который отлично работает, если я установил его на MAIN, но попытка запустить его с MyApplication, который объявлен MAIN, генерирует ошибку. Вероятно, очень глупый вопрос, но я все это неправильно решаю?

Спасибо

Пол

Ответы [ 2 ]

20 голосов
/ 21 июля 2011

Это можно исправить с помощью флага FLAG_ACTIVITY_NEW_TASK:

Intent intent = new Intent(this, ApplicationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Это потому, что вам нужно запустить новое задание, когда действие запускается вне контекста действия.Но я настоятельно рекомендую не запускать Activity из приложения onCreate().


. Android имеет 4 компонента: Activity, Service, ContentProvider и Broadcast.

Когда Android необходимо активировать один изэти компоненты из вашего приложения, он выглядит, если уже существует запущенный процесс с вашим приложением.Если нет, то Android запускает новый процесс, инициализирует его, а затем инициализирует ваш пользовательский экземпляр приложения.И затем он активирует один из необходимых компонентов.

Теперь давайте рассмотрим следующий сценарий: ваше приложение объявило провайдера контента в AndroidManifest.xml, и Android вот-вот запустит ваше приложение, чтобы вы могли предоставить некоторые данные другому приоритетному приложению..

  1. Запрос контент-провайдера отправлен
  2. Ваше приложение не запущено, и Android запускает новый процесс для него.
  3. Ваш пользовательский экземпляр приложения создан
  4. Application.onCreate().
  5. Вы запускаете действие
  6. Ваш провайдер контента получает запрос

Кто-то просто хотел подключиться к вашему провайдеру контента,но ваше приложение запустило Activity вместо этого.То же самое касается запуска фонового сервиса и иногда широковещательных приемников

А также подумайте, не захотел ли какой-либо другой активности приложения A запустить операцию X из вашего приложения.Но в onCreate() вы начали деятельность Y, а затем X также запускается Android.Затем пользователь нажимает назад.Что должно произойти?Его сложно ...

Запуск действий с Application * onCreate может привести к довольно странному взаимодействию с пользователем.Так что не делайте этого.


ОБНОВЛЕНИЕ: Поскольку Android гарантирует, что Приложение будет создано только один раз и перед любым другим компонентом, вы можете использовать следующий код для доступа к единственному приложению.экземпляр:

public class MyApplication extends Application 
{   
    private static MyApplication s_instance;

    public MyApplication()
    {
        s_instance = this;
    }

    public static MyApplication getApplication()
    {
        return s_instance;
    }
}
0 голосов
/ 21 июля 2011

Вы установили его в своем манифестном теге активности для этого намерения, которое вы запускаете (еще один, кроме основного)?

 </activity>
             <activity android:name=".InitialActivity"                          
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.package.INITACT" />  <--- this is only name by which you activity can be called.
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
...