避免从自身开始 activity
Avoid start an activity from itself
我的应用程序中有一个自定义按钮栏,我在多个 activity.
中使用它
它有一个开始 SettingsActivity
的设置按钮。
问题是:
我也在 SettingsActivity
中使用了这个按钮栏,我想避免从 SettingsActivity
本身开始。
我在一个片段中为按钮设置了 onClick,我在我的活动中使用了这个片段,然后我不能设置任何标志或额外的数据。
在设置按钮的 onClick 中,我设置了这样的意图:
intent = new Intent(getActivity(), SettingsActivity.class);
startActivityForResult(intent, 1);
我的工作:
我有 ParentActivity
所有其他 activity 都从它扩展,我覆盖了其中的 startActivityForResult
方法。
结果是我有开始 SettingsActivity
.
的意图
@Override
public void startActivityForResult(Intent intent, int requestCode) {
super.startActivityForResult(intent, requestCode);
overridePendingTransition(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left);
}
我想要的:
我想知道如何检测哪个 activity 调用了这个意图以及哪个 activity 将启动?
(抱歉我的英语不好)
您可以使用另一个参数 name
重载 startActivityForResult。所以在设置按钮的onClick中,直接使用重载的方法:
onClick(View v){
intent = new Intent(getActivity(), SettingsActivity.class);
startActivityForResult(intent, 1, this.getClass().getName());
}
父活动:
public void startActivityForResult(Intent intent, int requestCode, String name) {
if(!name.equals(com.yourpackage.settingsactivity))
startActivityForResult(intent, requestCode);
else Toast.makeText(this, "Already in SettingsActitivty", Toast.LENGTH_SHORT).show;
}
@Override
public void startActivityForResult(Intent intent, int requestCode) {
super.startActivityForResult(intent, requestCode);
overridePendingTransition(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left);
}
因此,假设您需要做的就是避免从自身调用 SettingsActivity,我建议您尝试其中一种内置启动模式。
http://developer.android.com/guide/topics/manifest/activity-element.html#lmode
如果您将 singleTop
用于 SettingsActivity,当它已经位于堆栈顶部时启动它不会导致启动新的 activity,而是启动现有的 activity 将调用其 onNewIntent()
方法(如果您不需要执行任何操作,可以忽略该方法)。
或者,如果出于某种原因这行不通,请进一步采用 Marlon 的建议,并假设您以明确的意图(设置 class 名称)启动 SettingsActivity
,您可以覆盖 startActivityForResult
并检查调用 activity 是否与目标 activity 相同,而不必使用 name
参数重载方法。
@Override
public void startActivityForResult(Intent intent, int requestCode) {
if (!intent.getComponent().getClassName().equals(getClass().getName()) {
super.startActivityForResult(intent, requestCode);
}
}
我的应用程序中有一个自定义按钮栏,我在多个 activity.
中使用它
它有一个开始 SettingsActivity
的设置按钮。
问题是:
我也在 SettingsActivity
中使用了这个按钮栏,我想避免从 SettingsActivity
本身开始。
我在一个片段中为按钮设置了 onClick,我在我的活动中使用了这个片段,然后我不能设置任何标志或额外的数据。
在设置按钮的 onClick 中,我设置了这样的意图:
intent = new Intent(getActivity(), SettingsActivity.class);
startActivityForResult(intent, 1);
我的工作:
我有 ParentActivity
所有其他 activity 都从它扩展,我覆盖了其中的 startActivityForResult
方法。
结果是我有开始 SettingsActivity
.
@Override
public void startActivityForResult(Intent intent, int requestCode) {
super.startActivityForResult(intent, requestCode);
overridePendingTransition(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left);
}
我想要的:
我想知道如何检测哪个 activity 调用了这个意图以及哪个 activity 将启动?
(抱歉我的英语不好)
您可以使用另一个参数 name
重载 startActivityForResult。所以在设置按钮的onClick中,直接使用重载的方法:
onClick(View v){
intent = new Intent(getActivity(), SettingsActivity.class);
startActivityForResult(intent, 1, this.getClass().getName());
}
父活动:
public void startActivityForResult(Intent intent, int requestCode, String name) {
if(!name.equals(com.yourpackage.settingsactivity))
startActivityForResult(intent, requestCode);
else Toast.makeText(this, "Already in SettingsActitivty", Toast.LENGTH_SHORT).show;
}
@Override
public void startActivityForResult(Intent intent, int requestCode) {
super.startActivityForResult(intent, requestCode);
overridePendingTransition(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left);
}
因此,假设您需要做的就是避免从自身调用 SettingsActivity,我建议您尝试其中一种内置启动模式。
http://developer.android.com/guide/topics/manifest/activity-element.html#lmode
如果您将 singleTop
用于 SettingsActivity,当它已经位于堆栈顶部时启动它不会导致启动新的 activity,而是启动现有的 activity 将调用其 onNewIntent()
方法(如果您不需要执行任何操作,可以忽略该方法)。
或者,如果出于某种原因这行不通,请进一步采用 Marlon 的建议,并假设您以明确的意图(设置 class 名称)启动 SettingsActivity
,您可以覆盖 startActivityForResult
并检查调用 activity 是否与目标 activity 相同,而不必使用 name
参数重载方法。
@Override
public void startActivityForResult(Intent intent, int requestCode) {
if (!intent.getComponent().getClassName().equals(getClass().getName()) {
super.startActivityForResult(intent, requestCode);
}
}