Различие между запуском Activity с домашнего экрана или другим действием из App

Мне нужно знать общий способ различения вызова активности из модуля запуска и вызова другой активности из моего приложения или возврата на стек активности

Кто-нибудь? это беспокоит меня довольно долго, и мне нужно положить его на отдых...

Заранее спасибо JQCorreia

6 ответов

Решение

В разделе "Создание вашей деятельности" позвоните getIntent(), Если действие запускается из панели запуска (начальный экран), значения для getAction() будет android.intent.action.MAIN и getCategories() вернет набор, который будет содержать категорию android.intent.category.LAUNCHER. Если действие начинается из другого места, эти значения могут быть null,

В дополнение к ответу @advantej вы можете расширить каждый стартовый вызов до этого действия, добавив дополнительный элемент к начальному намерению (например, intent.putExtra("caller", this.getClass().getSimpleName());

В деятельности onCreate метод, который вы можете проверить то, что предлагает @advantej.

Если инициатор не является значком домашнего экрана, то вы можете проверить, если intent.hasExtra("caller") возвращает истину, и если да, то что это.

Вы можете узнать это из флага намерений.

шаг 1:

  Intent intent = getIntent();
  int flag = intent.getFlag();

шаг 2:

if flag  =  Intent.FLAG_ACTIVITY_NEW_TASK 
  launch from other app or activities
else 
  launch from home page

Основываясь на ответе advantej, вот полный пример, который также скрывает кнопку ВВЕРХ, если действие было запущено с помощью значка запуска:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sell);

    /**
     * If this activity was started from launcher icon, then don't show the Up button in the action bar.
     */
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        Intent intent = getIntent();
        Set<String> intentCategories = intent.getCategories();
        boolean wasActivityStartedFromLauncherIcon = Intent.ACTION_MAIN.equals(intent.getAction()) && intentCategories != null && intentCategories.contains(Intent.CATEGORY_LAUNCHER);
        boolean showUpButton = !wasActivityStartedFromLauncherIcon;
        actionBar.setDisplayHomeAsUpEnabled(showUpButton);
    }

}

Вот удобный метод, поэтому вам не нужно писать его самостоятельно:

protected boolean isStartedByLauncher() {
    if (getIntent() == null) {
        return false;
    }
    boolean isActionMain = Intent.ACTION_MAIN.equals(getIntent().getAction());
    Set<String> categories = getIntent().getCategories();
    boolean isCategoryLauncher = categories != null && categories.contains(Intent.CATEGORY_LAUNCHER);
    return isActionMain && isCategoryLauncher;
}

В 2 случаях onRestart(); вызывается, 1. когда активность происходит из фона, 2. когда пользователь достигает активности с помощью кнопки "назад", затем пример решения: используйте функцию onBackPressed(), чтобы установить флаг... так что вы знаете, что onRestart вызывается из-за нажатия кнопки "назад"... в onRestart () проверьте флаг и сбросьте его и....

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

Ниже приведен код, который вы можете использовать (не проверено):

Активность, в которой вы хотите проверить (скажем, MainActivity.class):

Boolean onCreateCalled = false;
Boolean calledFromAppActivities = false;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    onCreateCalled = true;

    Bundle mainData = getIntent().getExtras();

    if (mainData != null) {
        if (getIntent().hasExtra("call_from_own_activity")) {
            calledFromAppActivities = true;
        }
    }

    .....

}

@Override
protected void onResume() {

    super.onResume();

    if (onCreateCalled && !calledFromAppActivities) {
        // The app was not called from any of our activities.
        // The activity was not resumed but was created.

        // Do Stuff
    }

    // To stop it from running again when activity is resumed.
    onCreateCalled = false;

    ....

}

При вызове MainActivity из других действий используйте код ниже:

private void call_main () {
    Intent i = new Intent(getApplicationContext(), MainActivity.class);
    i.putExtra("call_from_own_activity", true);
    startActivity(i);
}
Другие вопросы по тегам