当我从小部件启动活动时,我希望后退按钮转到主屏幕,而是转到应用程序的主要活动。在玩弄周围后我发现如果我以某种方式关闭主应用程序活动,则不会发生此问题。奇怪。
我找到了一个称为finish()的解决方案here;在我的主要活动的onPause()中。显然这是错误的解决方案,例如重新定位屏幕会导致onPause(),因此每当手机旋转时,will活动就会消失。
这是我开始活动的方式:
@Override
public void onReceive(Context context, Intent intent) {
[...]
//new Emergency().emDialog(context).show();
Intent myIntent = new Intent(context, EmergencyActivity.class);
// FLAG_ACTIVITY_NEW_TASK is needed because we're not in an activity
// already, without it we crash.
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(myIntent);
您可以在http://code.google.com/p/emergencybutton/source/browse
看到其余代码编辑:我尝试以不同方式运行活动,但仍然无法正常运行:
Intent myIntent = new Intent();
myIntent.setClassName("com.emergency.button", "com.emergency.button.EmergencyActivity");
答案 0 :(得分:8)
好的,所以我不确定这里发生了什么,但AndroidManifest.xml活动中的android:launchMode="singleInstance"
以某种方式修复了它。
<activity android:name=".EmergencyActivity"
android:launchMode="singleInstance"
@Octavian - 我应该澄清一下,我从AppWidgetProvider中的onReceive开始活动。我在主屏幕上,开始一个名为B的活动,但不知何故A和B都在活动堆栈中,而不仅仅是B.
http://developer.android.com/guide/topics/manifest/activity-element.html#lmode
答案 1 :(得分:6)
虽然我从未使用过小部件,但我相信当您点击小部件时,您正在恢复现有任务。因此,当您处于该任务中时,您将返回该任务中的最新活动(而不是Home)。
请参阅此链接并为您的小部件选择正确的启动模式 http://developer.android.com/guide/topics/fundamentals.html#lmodes
答案 2 :(得分:1)
行为并不奇怪,这只是Android的工作方式。活动堆栈只是跟踪所有活动。现在当你启动一个活动A开始另一个活动B时,你的堆栈看起来像(B,A)。如果你按下后退键,那么活动B将从堆栈中弹出,A将再次被带到前台。
正确的解决方案是在关闭finish()
后立即致电Intent
。
答案 3 :(得分:0)
由于某些原因,有时在应用程序中无法使用launchMode singleInstance。 在这种情况下,您应该开始活动并清除活动堆栈。您可以使用标记将其归档。有一个例子:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);