web-dev-qa-db-ja.com

ランチャーでアイコンを押して起動すると、アプリが完全に再起動する

私は、最初のAndroidアプリを数人のテスターに​​送信するアプリのリリースビルドを作成しようとしています。しかし、問題が発生しました。アプリを終了して、アイコンから起動して再入力すると、以前の場所に戻るのではなく、アプリ全体が再起動します。これは、終了直後に再入力しても発生します。ただし、ホームボタンを押したままにしておくと、最近のアプリリストから起動します。

私はこの問題を抱えている他の人をオンラインで検索しましたが、いくつかありますが、なぜ彼らにそれが起こっているのかについての確固たる答えはありませんでした。マニフェストファイルでlaunchmodeをsingletaskまたはsingleinstanceに設定することが古い質問で提案されましたが、それは私を助けませんでした-それに加えて-私が理解していることから、Androidはこの状況でタスクの前の状態に戻るため、それを行うために特別なマニフェストオプションが必要な理由がわかりません。

この問題に関する最も奇妙なことは、Eclipseとデバッガーを使用してスマートフォンにアプリを配置した場合、この問題は発生しないことです。デバッガーに接続する必要さえありません。アプリのデバッグバージョンを持っている限り、問題は発生しないようです。しかし、リリースバージョンを使用する場合(Androidツール-Eclipseで署名済みアプリケーションパッケージをエクスポートするメニューオプションを使用して作成)、問題が発生します。 、あなたの考えを聞いてみたい。

63
LayfieldK

アプリケーションで同じ問題が発生し、AndroidManifest.xmlファイルの"Android:launchMode="singleTop""宣言で"Android:launchMode="singleTask""の代わりに<activity>フラグを追加してこの動作を解決しました。これが誰かを助けることを願っています。

47
sky

これまでのところ、実際のデバイスへのインストール方法に基づいた問題であることがわかりました。具体的には次のとおりです。

  1. APKをデバイスのローカルストレージにコピーして貼り付け、デバイスからインストールするだけで、署名されているか署名されていないか、binフォルダーから取得されたかに関係なく、この動作が表示され、メニューアイコンからアプリが再起動します。

次のオプションのいずれかを使用してインストールすると、この問題は発生しません。

  1. ターミナルまたはコマンドプロンプトを使用してsdk/tools /に移動し、次に入力します

    _adb install <FILE PATH OF .APK FILE>
    _

    Linuxでは、次を入力します。

    _./adb install <FILE PATH OF .APK FILE>
    _
  2. Eclipseからプロジェクトを実行するだけです。

ベータテスト用に正しいAPKを配布する方法があるかどうかを知りたい。 APKをコピーして貼り付けて手動でインストールすると不正な動作が表示されるため、署名済みのAPKをエクスポートしようとしました。

更新:

私は解決策を見つけました。次の2つの手順に従います。

  1. activityタグ内のAndroidMainifest.xmlで、アプリのすべてのアクティビティに_Android:launchMode="singleTask" = true_を設定します。
  2. このコードをランチャーアクティビティのonCreate()に配置します。

    _if (!isTaskRoot())
    {
        final Intent intent = getIntent();
        final String intentAction = intent.getAction(); 
        if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
            finish();
            return;       
        }
    }
    _

この動作はAndroidのバグです。特別な場合ではありません。

31
Jayant Arora

LaunchModeをsingleTopとして使用できますAndroidManifest.xmlのランチャーアクティビティ

       <activity
        Android:name="<YOUR_ACTIVITY>"
        Android:label="@string/app_name"
        Android:launchMode="singleTop">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
6
vasanth

別の奇妙な原因、再起動は、Copy-to-Device-&-Installの後に「OPEN」をクリックしてアプリを起動したときにのみ発生します。

OS8.1でテストし、launchModeはアクティビティなし。

enter image description here

6
superuser
 // To prevent launching another instance of app on clicking app icon 
        if (!isTaskRoot()
                && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
                && getIntent().getAction() != null
                && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

            finish();
            return;
        }

setContentViewを呼び出す前に、ランチャーアクティビティに上記のコードを記述します。これで問題が解決します

3
Fathima km

これはAndroidのデフォルトの動作です。デバッグビルドでは、何らかの理由で動作が異なります。アクティビティにAndroid:launchMode="singleInstance"を追加することで解決できます。アイコンから起動した後に再起動する必要があります。

3
yak32

これを最初のアクティビティに追加します。

if (!isTaskRoot()) {
        finish();
        return;
}     
super.onCreate(savedInstanceState);
1
Bolling

次の例に示すように、Android:alwaysRetainTaskStateを使用してみてください。

<activity
    Android:name="com.jsnider.timelineplanner.MainActivity"
    Android:alwaysRetainTaskState="true"
    Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
1
jsnid00

Android:alwaysRetainTaskState="true" AndroidManifest.xmlのランチャーアクティビティ用。

    <activity
        Android:name=".YourMainActivity"
        Android:alwaysRetainTaskState="true">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

詳細については、 https://developer.Android.com/guide/topics/manifest/activity-element.html#always をご覧ください。

1
Moven

私にとっては、修正はLaunchMode = LaunchMode.SingleTopメインアクティビティのアクティビティ属性:

/// <summary>
    /// The main activity of the application.
    /// </summary>
    [Activity(Label = "SilhuettePhone",
        Icon = "@drawable/icon",
        Theme = "@style/MainTheme",
        MainLauncher = true,
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
        ScreenOrientation = ScreenOrientation.Portrait,
        LaunchMode = LaunchMode.SingleTop,
        WindowSoftInputMode = SoftInput.AdjustResize)]
0
adSad

Androidで戻るボタンを押すと、onDestroyメソッドが呼び出されます(onPause()メソッドのみが呼び出されるホームボタンを押すのとは対照的です)。

中断したところからアプリを続行する必要がある場合は、アプリの状態をonDestroy()メソッドに保存し、その状態をonCreate()メソッドに読み込みます。

0
Zoltán

この問題はAndroid 2019年のTVで見られます。より良い修正はありますか?

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

動作しますが、実際のソリューションよりもハッキングのように見えます。

0
Amit

私にとっては、間違って投稿したことがわかったNoHistory = true私のアクティビティ属性

[Activity(NoHistory = true, ScreenOrientation = ScreenOrientation.Landscape)]

これにより、アプリがこのアクティビティに再開できなくなり、再起動しました

0
Skaterhaz

上記のすべてのソリューションは、すべてのデバイスで一貫して機能しませんでした。一部のSamsungで機能しましたが、すべてではありませんでした。

私にとって問題の原因は、APKを手動でインストールすることでした。

0
Alberto M