web-dev-qa-db-ja.com

ランチャーアクティビティを開始する代わりに、トップアクティビティを再開する

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

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

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

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

<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;
}
39
Sudhaker

マニフェストでランチャーアクティビティとして指定されているアクティビティのonCreateメソッドで次のコードを使用してみてください。つまり、質問に投稿された元のコードのContentDownloadアクティビティです。

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

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

Androidドキュメントに関するAndroid Manifest launchModes: http://developer.Android.com/reference/Android/R。 styleable.html#AndroidManifestActivity_launchMode

35
Jadent

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

12
David Wasser

アプリのLAUNCHERアクティビティで次のコードを使用して、バックグラウンドでアプリがまだ生きていてアイコンがタップされたときにアプリが再び起動するのを防ぎます

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

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

    // Rest of your onCreate stuff goes here
}

これはLAUNCHERアクティビティを終了し、最後に使用したアクティビティを再開します。

10
Saenic

Finish()を呼び出さないでください。 Intentにフラグ 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);
4
Uriel Frankel

あなたのコードを見ずに、私はあなたがこの答えのようなものが欲しいと思う:

Androidはアクティビティを終了し、別のアクティビティを開始します

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);を設定する必要があり、ランチャーアクティビティも同様にfinish()する必要があります。

1
themanatuf