アプリケーションには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;
}
マニフェストでランチャーアクティビティとして指定されているアクティビティの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
launchMode="singleTask"
で定義された両方のアクティビティがあります。これが問題の根本です。それを削除します。
アプリのLAUNCHER
アクティビティで次のコードを使用して、バックグラウンドでアプリがまだ生きていてアイコンがタップされたときにアプリが再び起動するのを防ぎます
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!isTaskRoot()) {
finish();
return;
}
// Rest of your onCreate stuff goes here
}
これはLAUNCHER
アクティビティを終了し、最後に使用したアクティビティを再開します。
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);
あなたのコードを見ずに、私はあなたがこの答えのようなものが欲しいと思う:
Androidはアクティビティを終了し、別のアクティビティを開始します
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
を設定する必要があり、ランチャーアクティビティも同様にfinish()
する必要があります。