我在我的应用程序中有两个活动,一个是启动器,另一个是从第一个启动显式调用。
这里我的问题是,当我通过第二个活动中的主页键返回主屏幕并启动应用程序时,即使第二个活动已经在后台,第一个活动也会被启动。
编写第一个Activity是为了下载应用程序工作所需的资产,一旦下载资产,它就会触发第二个活动并调用自我完成。
以下是我的申请表。
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<! Download the Required Assets if not found on SD Card -->
<activity android:name=".ContentDownload"
android:screenOrientation="landscape"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|locale"
android:launchMode="singleTask"
android:alwaysRetainTaskState="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".ActualAppActivity"
android:screenOrientation="landscape"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|locale"
android:launchMode="singleTask"
android:alwaysRetainTaskState="true"
/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<supports-screens android:smallScreens="false" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/>
有人可以指导我如何使第二个活动直接获得控制,而不是在调用启动器并且它在后台时再次通过第一个活动。
以下是我的onResult回拨方法。
public void onResult(String assetPath, int result)
{
if(result == RESULT_OK)
{
startActivity(new Intent(this, ActualAppActivity.class));
activity.destroyDownloadActvity();
finish();
}
else
{
finish();
java.lang.System.exit(0);
}
activity.destroyDownloadActvity();
activity = null;
}
答案 0 :(得分:34)
尝试在Manifest中指定为Launcher Activity的活动的onCreate方法中使用以下代码,即来自问题中发布的原始代码的ContentDownload活动:
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
finish();
return;
}
这将在显示Launcher活动之前通过检测到已经有任务正在运行来完成它,并且您的应用应该恢复到最后一个可见的活动。
请参阅有关Android Manifest launchModes的Android文档中的此页面:http://developer.android.com/reference/android/R.styleable.html#AndroidManifestActivity_launchMode
答案 1 :(得分:12)
您已使用launchMode="singleTask"
定义了自己的活动。这是你问题的根源。删除它。
答案 2 :(得分:9)
我在我的应用的foreach (var referralDiaryEvent in referralDiaryEvents)
{
// create a NEW instance for every event!
var timelineDetailsViewModel = new TimelineDetailsViewModel();
timelineDetailsViewModel.EventDate = referralDiaryEvent.App_DiaryEvent.EventDateTimeScheduled;
timelineDetailsViewModel.EventType = referralDiaryEvent.App_DiaryEvent.Ref_EventType.Description;
timelineDetailsViewModel.EventDescription = referralDiaryEvent.App_DiaryEvent.EventName;
viewModel.TimeLineList.Add(timelineDetailsViewModel);
}
活动中使用以下代码,以防止该应用在后台仍处于活动状态且点按图标时再次启动该应用
LAUNCHER
这只是完成@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!isTaskRoot()) {
finish();
return;
}
// Rest of your onCreate stuff goes here
}
活动并恢复上次使用的活动。
答案 3 :(得分:4)
不要调用finish()。您需要将标志FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_NEW_TASK传递给Intent。
Intent intent = new Intent(this, ActualAppActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK| Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
答案 4 :(得分:1)
没有看到你的代码,我想你想要这样的回答:
Android finish Activity and start another one
您需要设置intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
,并且您还需要finish()
您的启动器活动。
答案 5 :(得分:-1)
您可以做的是在持久性存储中存储一个字符串,用于确定资产是否已经加载。
然后,在主活动中,您可以检查资产是否已加载,然后启动所需的活动。
if(assets_already_downloaded)
second_activity();
else
download_asset_activity();