Подтвердить что ты не робот

Дифференциация запуска Activity с главного экрана или другого действия из приложения

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

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

Спасибо заранее JQCorreia

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

шаг 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

Ответ 4

в 2 случаях onRestart(); вызванный, 1. Когда активность исходит из фона, 2. Когда пользователь достигает активности с помощью кнопки "Назад", тогда образец решения: используйте функцию onBackPressed(), чтобы установить флаг.. так что вы знаете, что onRestart называется becouse of back button press... в onRestart() проверьте флаг и reset его и....

Ответ 5

На основе answere answer, вот полный пример, который также скрывает кнопку UP, если действие было запущено из значка запуска:

@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);
    }

}

Ответ 6

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

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;
}

Ответ 7

Самым простым подходом, который я могу придумать, будет пропуск флага при запуске действия из ваших собственных действий. Вы также должны проверить, было ли действие создано или возобновлено, это можно сделать, установив логическое значение в методе 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
    }

    ....

}

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

private void call_main () {
    Intent i = new Intent(getApplicationContext(), MainActivity.class);
    i.putExtra("call_from_own_activity", true);
    startActivity(i);
}