40

私のアプリケーションには 2 つのアクティビティがあり、1 つはランチャーで、もう 1 つは最初から明示的な呼び出しとして起動されます。

ここで私の問題は、2番目のアクティビティからホームキーを押してアプリケーションを起動してホーム画面に戻ると、2番目のアクティビティがすでにバックグラウンドにあるにもかかわらず、最初のアクティビティが再び開始されることです。

最初のアクティビティは、アプリケーションが動作するために必要なアセットをダウンロードするように記述されています。アセットがダウンロードされると、2 番目のアクティビティがトリガーされ、finish が呼び出されます。

以下は、アプリケーションの私のマニフェストです。

<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"/>

ランチャーが呼び出されてバックグラウンドにある場合、最初のアクティビティを再度実行するのではなく、2 番目のアクティビティを直接制御する方法を教えてください。

以下は私の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 アクティビティとして指定されているアクティビティの onCreate メソッドで次のコードを使用してみてください。つまり、質問に投稿された元のコードの ContentDownload アクティビティです。

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

これにより、実行中のタスクが既に存在することが検出されて表示される前にランチャー アクティビティが終了し、代わりにアプリは最後に表示されたアクティビティから再開する必要があります。

Android マニフェスト launchModes に関する Android ドキュメントのこのページを参照してください: http://developer.android.com/reference/android/R.styleable.html#AndroidManifestActivity_launchMode

于 2014-01-09T14:25:30.900 に答える
12

で定義された両方のアクティビティがありますlaunchMode="singleTask"。これが問題の根本です。それを削除します。

于 2012-07-30T15:02:14.783 に答える
4

finish()を呼び出さないでください。インテントにフラグFLAG_ACTIVITY_CLEAR_TASKおよびFLAG_ACTIVITY_NEW_TASKを渡す必要があります。

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 アクティビティを終了し、別のアクティビティを開始する

設定する必要があり、ランチャー アクティビティ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 に答える