1. ホーム
  2. アンドロイド

[解決済み】アプリが再開されず、再起動する。

2022-04-18 06:14:50

質問

解決策とまではいかなくても、少なくともある動作の説明について、誰かが手助けしてくれるといいのですが。

問題点

あるデバイスでは、ランチャーアイコンを押すと現在のタスクが再開され、別のデバイスでは、最初の起動意図が発生します (事実上アプリが再起動します)。なぜこのような現象が発生するのでしょうか?

ディテールについて

Launcher Icon"を押すと、アプリが普通に起動する - つまり、最初の名前を持つIntentが起動するのだと思います。 Activity というアクションで android.intent.action.MAIN とカテゴリ android.intent.category.LAUNCHER . しかし、これは常にそうであるとは限りません。

大半の端末では、アプリが既に起動している状態でランチャーアイコンを押すと、そのプロセスで現在起動しているアクティビティが再開されます( NOT 最初の Activity ). OSメニューの"最近のタスク"から選択した場合と同じように再開されます。これは、私が欲しい動作です すべて デバイスを使用します。

しかし、他の一部のデバイスでは、異なる動作が発生します。

  • Motorola Xoomでは、ランチャーアイコンを押したときに、アプリが 常に 初期起動を開始する Activity 現在起動しているものに関係なく ランチャーアイコンは常に "LAUNCHER" のインテントを開始すると仮定しています。

  • Samsung Tab 2では、ランチャーアイコンを押すと、アプリをインストールしたばかりの場合は、必ず最初に起動する Activity (Xoomと同じ) - しかし、インストール後にデバイスを再起動すると、ランチャーアイコンが代わりにアプリを再開します。これらのデバイスは、デバイスの起動時に、インストールしたアプリをルックアップテーブルに追加し、ランチャーアイコンが実行中のタスクを正しく再開できるようにしているのではないでしょうか?

という回答を何度も読みました。 を追加するだけで、私の問題と同じようなことができます。 android:alwaysRetainTaskState="true" を使用するか launchMode="singleTop" から Activity は答えにならない。

編集する。

本アプリの直近の起動後、この挙動が発生し始めたのは すべて デバイスを再起動すると おかしいと思うのですが、再起動のプロセスを調べても、何が問題なのかがわかりません。

解決方法を教えてください。

アハッ!(tldr;下部の太字の文を参照)

問題を発見した... と思います。

ということで、まずは仮定から。ランチャーを押すと、デフォルトの Activity または、もし Task が開いている場合、それを最前面に表示します。別の言い方をすれば、ナビゲーションのどの段階でも、新しい Taskfinish を指定すると、ランチャーがアプリを再開しなくなります。

もしその推測が本当なら、それはバグのはずです。 Task は同じプロセスで、最初に作成されたものと同じように有効なレジュメ候補となるのでしょうか?

私の問題は、これらのフラグをいくつかの Intents :

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );

というのは一目瞭然ですが FLAG_ACTIVITY_NEW_TASK は新しい Task , 上記の仮定が有効であることを理解していなかったのです。確かにこれは犯人だと思い、削除してテストしてみましたが、やはり問題があったので却下しました。しかし、まだ以下のような状態でした。

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

スプラッシュ画面が"main"を起動していました。 Activity というフラグを立てています。結局のところ、もし私が私のアプリを "restart" して Activity がまだ実行中だった場合、私はむしろその状態情報を保存したいのです。

でお気づきでしょう。 ドキュメント を開始することについては言及されていません。 Task :

設定されている場合、起動されるアクティビティがすでに 現在のタスクの新しいインスタンスを起動する代わりに、その アクティビティが終了すると、その上にある他のアクティビティはすべて終了し このインテントは、(今トップになっている)古いアクティビティに、1つのインテントとして配信されます。 新しいIntent

例えば、アクティビティからなるタスクを考えてみましょう。A, B, C, Dのアクティビティからなるタスクを考える。 DがstartActivity()を呼び出したとき、そのIntentは、A, B, C, Dに解決される。 アクティビティBのコンポーネントが終了すると、CとDは終了し、BはアクティビティBのコンポーネントを受け取ります。 となり、その結果、スタックは次のようになります。A, B となる。

上記の例で現在実行中のアクティビティBのインスタンスは、次のようになります。 ここで開始する新しいインテントを、その onNewIntent() メソッドを呼び出すか、あるいはそれ自体を終了して新しい インテントがあります。起動モードを "multiple"と宣言している場合 (これは デフォルト)で、FLAG_ACTIVITY_SINGLE_TOPを設定していない場合は、同じ イントは終了して再作成されます。 モード、またはFLAG_ACTIVITY_SINGLE_TOPが設定されている場合、このインテントは を現在のインスタンスの onNewIntent() に送出します。

この起動モードは、次のように組み合わせても効果的です。 FLAG_ACTIVITY_NEW_TASK: タスクのルート・アクティビティを開始するために使用する場合。 そのタスクの現在実行中のインスタンスがあれば、それを をフォアグラウンドにし、それをルート状態にクリアする。これは特に 例えば、通知からアクティビティを起動するときに便利です。 マネージャーを使用します。

そこで、以下のような状況になりました。

  • A 起動 BFLAG_ACTIVITY_CLEAR_TOP , A の仕上がりになります。
  • B はサービスの再起動を希望しているので、ユーザーを A サービス再開のロジックを持つ とUI(フラグなし)があります。
  • A 打ち上げ B をFLAG_ACTIVITY_CLEAR_TOPで表示します。 A を終了させます。

この段階で、2番目の FLAG_ACTIVITY_CLEAR_TOP フラグが再起動する B タスクスタックにある を破壊しなければならないと考えています。 Task を起動し、新しいものを開始するため、私の問題が発生します。

では、もし私の仮定がすべて正しければ。

  • その Launcher は、最初に作成されたタスクの再開のみ
  • FLAG_ACTIVITY_CLEAR_TOP を再起動させると、唯一残っている Activity を再作成し、さらに新しい Task