Различие между запуском 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);
}