ランチャーからのアクティビティの呼び出しと、アプリ内からの別のアクティビティからの呼び出し、またはアクティビティスタックのBACKを区別する一般的な方法を知る必要があります
誰?これはかなり長い間私を悩ませています、そして私はそれを休ませる必要があります...
よろしくお願いしますJQCorreia
ランチャーからのアクティビティの呼び出しと、アプリ内からの別のアクティビティからの呼び出し、またはアクティビティスタックのBACKを区別する一般的な方法を知る必要があります
誰?これはかなり長い間私を悩ませています、そして私はそれを休ませる必要があります...
よろしくお願いしますJQCorreia
アクティビティのonCreateで、を呼び出しますgetIntent()
。アクティビティがランチャー(ホーム画面)から開始された場合、の値はgetAction()
になりandroid.intent.action.MAIN
、getCategories()
android.intent.category.LAUNCHERカテゴリを含むセットが返されます。アクティビティが他の場所から開始された場合、これらの値はである可能性がありますnull
。
@advantejの回答に加えて、各start-callをそのアクティビティに拡張して、開始インテントに追加を追加することができます(例intent.putExtra("caller", this.getClass().getSimpleName()
)。
アクティビティのonCreate
メソッドでは、@advantejが提案する内容を確認できます。
イニシエーターがホーム画面のアイコンでない場合は、intent.hasExtra("caller")
trueが返されるかどうか、また返される場合はそれが何であるかをさらに確認できます。
インテントフラグから見つけることができます。
ステップ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
2つの場合、onRestart(); と呼ばれる、1。アクティビティがバックグラウンドから発生した場合、2。ユーザーが戻るボタンでアクティビティに到達した場合、サンプルソリューション:onBackPressed()関数を使用してフラグを設定します。 onRestart()でフラグをチェックしてリセットし、...
advantejの回答に基づいて、アクティビティがランチャーアイコンから起動された場合に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);
}
}
これが便利な方法なので、自分で書く必要はありません。
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;
}
私が考えることができる最も簡単なアプローチは、あなた自身の活動から活動を開始する間に旗を渡すことです。また、アクティビティが作成または再開されたかどうかを確認する必要があります。これは、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);
}