Программно определить действие по умолчанию (при запуске приложения)

Мое приложение состоит из нескольких действий.

Activity A — это мое главное меню с некоторыми значками. Это действие может запуститься в зависимости от того, какой значок вы нажмете: действие B, C, D, E или F.

Это нормально и очень просто. Активность A используется по умолчанию.

Теперь я сделал параметр предпочтения, который позволяет пользователям начинать свою любимую деятельность.

Некоторые пользователи на самом деле предпочтут, например, получить непосредственно Activity B.

Единственный способ, которым я нашел решение, состоял в том, чтобы сделать это в действии A. Это решение очень уродливо, потому что действие A всегда будет запускаться и закрываться автоматически:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    settings = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());
    final Intent intent = getIntent();
    String action = intent.getAction();

    if (Intent.ACTION_MAIN.equals(action)) {
        switch (Integer.valueOf(settings.getString("Activitypref", "1"))) {
        case 2:
            Intent i = new Intent(ActivityA.this, ActivityB.class);
            finish();
            startActivity(i);
            break;
        case 3:
            i = new Intent(ActivityA.this, ActivityC.class);
            finish();
            startActivity(i);
            break;
        case 4:
            i = new Intent(ActivityA.this, ActivityD.class);
            finish();
            startActivity(i);
            break;
        case 5:
            i = new Intent(ActivityA.this, ActivityE.class);
            finish();
            startActivity(i);
            break;
        case 6:
            i = new Intent(ActivityA.this, ActivityF.class);
            finish();
            startActivity(i);
            break;
        default:
            break;
        }
    } 

person Waza_Be    schedule 27.06.2011    source источник
comment
Если единственная цель Activity A — решить, какую другую активность запустить, то я не вижу в этом уродливого решения. Похоже, что Activity A выполняет свою работу.   -  person DeeV    schedule 27.06.2011
comment
Да, но пользователь может обойти это действие и перейти непосредственно к действию X. При настройке в настройках я не хочу, чтобы действие A запускалось, за исключением случаев, когда пользователь нажимает кнопку «Домой» после просмотра действия X.   -  person Waza_Be    schedule 27.06.2011
comment
Больше всего раздражает время загрузки и мигание экрана при запуске Activity A и закрытии его в onCreate.   -  person Waza_Be    schedule 27.06.2011
comment
Вы можете создать класс, который расширяет приложение, и он будет решать, какую активность запускать. В разделе «Атрибуты приложения» на вкладке «Приложение» манифеста вы должны присвоить Name имени класса, который его расширяет. Поскольку он не должен обрабатывать пользовательский интерфейс, это звучит как хорошее место для оператора switch. Однако удалите вызовы finish().   -  person DeeV    schedule 27.06.2011


Ответы (1)


Вместо ActivityA рассмотрите возможность использования активности оболочки, которая будет вызываться из панели запуска. Вы устраните необходимость проверки ACTION_MAIN. Также вы можете сохранить имя целевого действия в настройках и использовать его для прямого запуска целевого действия с помощью другой сигнатуры намерений:

public Intent (String action)

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

 <activity class=".ActivityA" android:label="...">
             <intent-filter>
                 <action android:name="mypackage.ActivityA" />                    
             </intent-filter>
 </activity>

И в StartActivity

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    settings = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());

    String action = settings.getString("Activitypref","mypackage.ActivityA");
    Intent intent = new Intent(action);
    startActivity(intent);
    ....
}

Возможно, вам придется немного повозиться, чтобы сделать это правильно.

person Alex Gitelman    schedule 27.06.2011
comment
Здравствуйте, Алекс, ваше решение кажется именно тем, что я ищу, но, к сожалению, я не понимаю, что вы имеете в виду. Я чувствую себя немного глупо, но вы можете небольшой фрагмент или пример? - person Waza_Be; 27.06.2011
comment
Я добавил обновление. У меня сейчас нет доступа к моему коду Android, поэтому вам, возможно, придется повозиться с ним, чтобы все было правильно. - person Alex Gitelman; 27.06.2011
comment
Ответ отличный, но ваша обертка похожа на мою предыдущую активность A и заставляет экран немного мигать (запускается StartActivity, затем ACtivityA), тогда мне также нужно ее закончить, на самом деле это то же самое, что и раньше. - person Waza_Be; 27.06.2011
comment
Не могли бы вы уточнить, какое именно значение я должен передать методу startActivity()? Я пытаюсь запустить одно из предопределенных действий на основе некоторого условия. - person Slava Fomin II; 06.03.2015