Различение запуска Активности с домашнего экрана или от другой Активности из Приложения - PullRequest
18 голосов
/ 12 апреля 2011

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

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

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

Ответы [ 7 ]

27 голосов
/ 12 апреля 2011

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

3 голосов
/ 12 апреля 2011

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

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

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

1 голос
/ 20 января 2017

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

шаг 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
0 голосов
/ 16 января 2019

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

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

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;
}
0 голосов
/ 16 июня 2016

На основе ответа 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);
    }

}
0 голосов
/ 19 ноября 2014

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

...