这与my previous question非常相似,因为它是某种跟进。我对给出的唯一解决方案不满意;此外,解决方案是针对与此问题略有不同的问题。那么让我试着再次解释这个问题......
BroadcastReceiver
)。这和我之前的问题没什么不同......事实是,“主要活动”只是一个例子。我可以打开应用程序主活动,然后通过菜单选项打开about活动并按下主页按钮。后面的堆栈现在是MainActivity
»AboutActivity
。这意味着当在“某些活动”中按下后退按钮时(通过按下通知开始),我们将被带到后台堆栈的顶部,即关于活动。
基本上想要的是在“某些活动”中按下后退按钮时阻止打开任何其他活动(再次按下通知开始)。我希望被带到我原来的位置,可能是桌面或其他应用程序的活动,但不是我的应用程序的MainActivity
也不是AboutAcitivity
因为那不是我的位置,那些是在后面的堆栈,在后台“睡觉”。
我已经提出了一个解决方案,但我不认为它非常优雅,而且我正在寻找更多,更好,更优雅的东西...如果您有任何其他建议,请告诉我。
无论如何,这是我提出的解决方案:
// I use this class for public static (or public static final) members and
// methods
public final class AppHelper {
public static final String KEY_RESUME_FROM_NOTIFICATION = "resumeFromNotification";
private static boolean sResumeFromNotification = false;
public static boolean getResumeFromNotification() {
return sResumeFromNotification;
}
public static void setResumeFromNotification(boolean resumeFromNotification) {
sResumeFromNotification = resumeFromNotification;
}
}
public class MainActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
(...)
}
@Override
protected void onResume() {
super.onResume();
if(AppHelper.getResumeFromNotification()) {
AppHelper.setResumeFromNotification(false);
moveTaskToBack(true);
}
}
}
public class AboutActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
(...)
}
@Override
protected void onResume() {
super.onResume();
if(AppHelper.getResumeFromNotification()) {
AppHelper.setResumeFromNotification(false);
moveTaskToBack(true);
}
}
}
public class SomeActivity extends Activity {
// This will be called when the notification is pressed and the activity is
// not opened yet
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
(...)
extractIntentExtras(intent);
}
// This will be called if the activity is already opened and the
// notification is pressed
@Override
protected void onNewIntent(Intent intent) {
extractIntentExtras(intent);
super.onNewIntent(intent);
}
private void extractIntentExtras(Intent intent) {
Bundle bundleExtras = intent.getExtras();
if(bundleExtras != null) {
// These intent extras are set on the Intent that starts this activity
// when the notification is pressed
AppHelper.setResumeFromNotification(bundleExtras.getBoolean(
AppHelper.KEY_RESUME_FROM_NOTIFICATION));
mRowId = bundleExtras.getLong(AgendaNotesAdapter.KEY_ROW_ID);
populateNoteUpdateFields();
}
}
}
我不知道,但这个解决方案对我来说看起来并不优雅(但它的工作方式与我预期的一样)而且我正在寻找替代方案,或者对我提出的解决方案提出强烈意见,认为这是一个可接受且良好的解决方案。想法?
答案 0 :(得分:4)
在做了一些阅读之后,也许这就是你需要的旗帜组合:
Intent intent = new Intent(mContext, SomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);
我认为这应该强制你的SomeActivity类在一个全新的任务中启动。
答案 1 :(得分:-1)
从通知启动Activity时,您可以控制将要打开的Activity如何放在后台堆栈中,以及它与Intent标志关联的任务。您可以尝试以下方式:
Intent intent = new Intent(mContext, SomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
如果这不起作用,请尝试设置一些other flags,直到获得所需的行为。
答案 2 :(得分:-1)
您是否希望将MainActivity留在历史中?如果没有,那么我的简单粗略的解决方案是在暂停时完成MainActivity。 (在MainActivity中调用此方法)
@Override
public void onPause() {
finish();
}
这将确保您在远离它时远离历史记录删除MainActivity,并且在按下后退按钮时将永远不会显示。 这也可以用于AboutActivity。