40

我的应用程序中有两个活动,一个是启动器,另一个是作为第一个的显式调用启动的。

在这里我的问题是,当我通过从第二个活动按主页键返回主屏幕并启动应用程序时,即使第二个活动已经在后台,第一个活动也会再次启动。

编写第一个 Activity 是为了下载应用程序工作所需的资产,一旦下载了资产,它就会触发第二个 Activity 并为 self 调用完成。

以下是我的应用程序清单。

<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;
}
4

6 回答 6

37

尝试在清单中指定为 Launcher Activity 的活动的 onCreate 方法中使用以下代码,即问题中发布的原始代码中的 ContentDownload 活动:

if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
  finish();
  return;
}

这将通过检测到已经有一个任务正在运行来完成您的 Launcher Activity,然后您的应用程序应该恢复到最后一个可见的 Activity。

请参阅 Android 文档中有关 Android 清单启动模式的此页面:http: //developer.android.com/reference/android/R.styleable.html#AndroidManifestActivity_launchMode

于 2014-01-09T14:25:30.900 回答
13

我在我的应用程序的活动中使用以下代码LAUNCHER来防止应用程序在后台仍然存在并且点击图标时再次启动

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (!isTaskRoot()) {
        finish();
        return;
    }

    // Rest of your onCreate stuff goes here
}

这只是完成LAUNCHER活动并恢复最后使用的活动。

于 2016-08-10T16:27:06.497 回答
12

您的两个活动都使用launchMode="singleTask". 这是你问题的根源。删除它。

于 2012-07-30T15:02:14.783 回答
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);
于 2012-07-30T12:43:57.650 回答
1

在没有看到您的代码的情况下,我认为您想要这样的答案:

Android 完成 Activity 并启动另一个

您需要设置intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);并且还需要finish()启动器活动。

于 2012-07-30T12:34:30.927 回答
-1

您可以做的是在持久存储中存储一个字符串,该字符串确定之前是否已加载资产。

然后,在主活动中,您可以检查资产是否已加载,然后启动所需的活动。

if(assets_already_downloaded)
  second_activity();
else
  download_asset_activity();
于 2012-07-30T12:36:58.637 回答