問題タブ [launchmode]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
183 参照

android - launchModeについて混乱する

Bを呼び出すアクティビティAがあります。その時点で、ユーザーがホームボタンを押したとします。

1)ユーザーがホームボタンを長押しして最近起動したアプリケーションを表示すると、ユーザーはアクティビティBに戻ります。

2)ユーザーがショートカット(アプリケーションのアイコンを押す)を介してアプリケーションを開くと、アクティビティAの別のインスタンスが作成されます。

アクティビティにlaunchModeを設定しなかったので、そうだと思いlaunchMode="standard"ます。デフォルトの動作は、アクティビティBに戻ることです。

ポイント2が発生しているのはなぜですか?どちらの行動も同じ結果になるといつも思っていました。

0 投票する
4 に答える
5295 参照

android - android --launchMode = singleTaskと通知?

私がこれから尋ねようとしていることについていくつかの投稿があったことは知っていますが、正しい答えの投稿は見つかりません。

私の理解では、メインアクティビティ(Aと呼びましょう)のlaunchModeがsingleTaskに設定されていて、AがアクティビティBを開始した場合、ホームボタンをクリックすると履歴スタックが破棄され、アプリケーションを再起動するとAに戻ります。 Bではありません。

永続的な通知があり、ユーザーが通知をクリックするたびにメインアクティビティの複数のインスタンスを表示したくないため、launchModeをsingleTaskに設定しました。

私が両方に対応できるようにするために私が見逃しているものはありますか?

そのため、ユーザーが通知からアプリを起動したいときはいつでも、最後の(現在の)アクティビティに戻ることができるようにする方法があるかどうかを尋ねています。

launchModeをsingleTopに変更すると機能しますが、起動するたびにメインアクティビティの複数のインスタンスを取得します。

ありがとう

アンドレアス

0 投票する
1 に答える
6485 参照

android - SINGLE_TOP | CLEAR_TOP は 95% の確率で機能するようです。なんで5%?

自明ではないアクティビティ構造を持つほぼ完成したアプリケーションがあります。このアプリにはプッシュ通知が関連付けられており、通知エントリを選択すると、アプリがフォアグラウンド/バックグラウンド/非アクティブのいずれであるかに関係なく、特定のアクティビティが表示されるはずです。

アプリがアクティブでない場合、アプリを正常に起動し、適切な部分に自動ナビゲートできました。ただし、アプリがアクティブな場合、問題があります。問題の性質を伝えるために、問題の簡略化されたバージョンを提示し、必要に応じてアプリのアクティビティ構造と関連コードの詳細を投稿します (実際には、現在取り組んでいます)。

したがって、私のアプリのアクティビティ スタック (大幅に簡略化) は次のようになります。

A -> B -> X

ここで、ルート アクティビティである A はログイン ページです。B は「ホームページ」のようなもので、X はホームページから開始できるいくつかのアクティビティの 1 つです (ただし、一度にアクティブになるインスタンスは 1 つだけです。これらは B からのみ開始できるためです)。

通知が選択されると、アプリケーションが B に自動的にナビゲートする必要があります。[A]、[A -> B]、[A -> B -> X]、または [ ] (アプリはアクティブではありません)。

私の通知は、インテントをアクティビティ A に渡します。CLEAR_TOP フラグと NEW_TASK フラグを使用してみましたが、何も使用しませんでした。A は現在、launchmode=singleTask を持っています。これを行うことで、考えられるすべての既存のスタック構成に対処し、それらを [A] に減らしていることがわかります。インテントには、通常の起動とは対照的に、通知からのものであることを識別するエクストラも含まれています。

アクティビティ A は、インテントが通知から送信されたことを識別すると ( onCreate() と onNewIntent() の両方でこれを行うことができます)、インテントをアクティビティ B に送信します。このインテントには、CLEAR_TOP と SINGLE_TOP が含まれます。B には launchmode=singleTop があります。

95% の確率で、これは希望どおりに機能し、通知を押した後、アプリのスタックは [A -> B] です。約 5% の確率で、アプリは [A -> B -> B] のスタックで終了します。

ここで何が起こっているのか、または私が間違っていることについてのアイデアはありますか?

これが重要な問題であることが判明した場合は、詳細を投稿します。実際、現在詳細を投稿しています...

~~~~~~~~~~~~~~~~~~~~~~詳細~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~

デバッガーをステップ実行すると、A がそのインテントを B に送信するたびに、B の既存のインスタンスが onCreate() される前に onDestroy() され、さらに onNewIntent() が呼び出されることがわかります。これは私には奇妙に思えます。使用しているフラグ (CLEAR_TOP と SINGLE_TOP) を誤解しているか、他の何かがそれらを妨害していることを示唆しています。

デバッグで誤ったスタック構造を再現できませんでした。デバッグで発生しないためか、十分な回数試していないためかどうかはわかりません。

作成中のインテントのコード:

C2DM 受信機サービスでは:

LoginPage (アクティビティ A) で、ログインに成功した後:

アクティビティ スタック構造の詳細については、次の図をご覧ください。

http://i89.photobucket.com/albums/k207/cephron/ActivityStack.png

そして、ここに千の言葉があります:

アクティビティ A はログイン ページです。ログインに成功すると、B が開始されます。B は TabActivity であり、その中に 3 つのアクティビティ (C、D、E で表されます) が含まれています。C、D、および E のそれぞれは、実際には子アクティビティがアクティビティの通常のスタック動作を模倣する ActivityGroup です。

そのため、各タブには独自のアクティビティ スタックが含まれており、タブを切り替えると、ユーザーのナビゲーションによって現在プッシュ/ポップされているこれらのスタックが変更されます (各タブには、エンティティの階層構造を参照する ListActivities のスタックが含まれます)。これらは、巨大な 'B' TabActivity (X で表される) を超えて新しいアクティビティを開始することもできます。

そのため、アクティビティ A からログインすると、さらにユーザー入力が受け入れられる前に、少なくとも 3 つのアクティビティが作成されます。 : デフォルトのタブに属するもの。この ActivityGroup は画面には表示されませんが、子アクティビティのスタックの最上位のアクティビティのみが表示されます。-最後に、その ActivityGroup のスタックの「ルート」アクティビティが作成されます (図では、F がそのようなアクティビティの例です)。このアクティビティは、TabWidget の下に表示されます。

各タブに 1 回アクセスした後は、タブを切り替えてもアクティビティが作成/破棄されることはありません (メモリ キルはカウントされません)。任意のタブを押すと、そのスタックの一番上にあるアクティビティが終了し、その下にあるアクティビティが表示されます。任意のタブでルート アクティビティ (F など) から戻ると、TabActivity 全体が終了し、ユーザーが A に戻ります。

B に渡されるインテントは、デフォルトとは異なるタブに自動的に移動するように指示します。[A -> B -> B] のスタックになった場合、最初の B は正しいタブに移動し、2 番目はデフォルトです。

0 投票する
2 に答える
1782 参照

android - singleInstance アクティビティからアクティビティを開始するには?

クリックすると小さなダイアログをポップアップできるウィジェットがあります。これらのダイアログは、singleInstance launchMode の RemoteActivity と呼ばれるアクティビティによって表示されます。これらのダイアログの 1 つに、メイン アプリ MainActivity を起動するためのボタンがあり、これには標準の launchMode があります。

ただし、このボタンをクリックして startActivity() を呼び出すと、MainActivity は起動されませんが、logcat で対応する「Starting activity: Intent { ... }」を確認できます。

RemoteActivity の launchMode を標準に設定すると、MainActivity が起動されますが、これは私が望むものではありません。RemoteActivity は単なるウィジェットの拡張であり、他のアクティビティとスタックさせたくありません。

FLAG_ACTIVITY_NEW_TASK も試しましたが、役に立ちませんでした。ドキュメントによると、とにかく必要ではないはずです:

一方、「singleInstance」アクティビティでは、他のアクティビティをそのタスクの一部にすることはできません。タスク内の唯一のアクティビティです。別のアクティビティを開始すると、そのアクティビティは別のタスクに割り当てられます — FLAG_ACTIVITY_NEW_TASK がインテント内にあるかのように。

メイン アクティビティを開始するにはどうすればよいですか?

更新/エラッタ:

MainActivity は実際に起動されますが、まだタスクの一部になっていない場合のみです。ランチャーから MainActivity を通常どおり起動し、[戻る] を押して終了すると、RemoteActivity が MainActivity を起動します。

しかし、Back を押す代わりに Home を押して MainActivity を終了すると、logcat にはインテントが表示されますが、RemoteActivity は MainActivity を起動できません。

Froyoでこれをテストしています。

何が起こっているのか分かりますか?

0 投票する
2 に答える
1275 参照

android - Android:launchMode="singleTask"によるセキュリティ例外

アクティビティの起動モードをsingleTaskと宣言しました。アプリケーションを起動し、ホームボタンを押して、メールクライアント(この場合はGmail)に移動し、アプリケーションを使用して添付ファイルをプレビューすると、Androidバージョン2.3以降でセキュリティ例外が発生します。 Gmailの添付ファイルにアクセスするための権限。以前のバージョンでは例外は発生せず、launchModeとしてsingleTaskを使用しない場合。

この行で例外が発生します-

ここで、mContextはアクティビティコンテキストです。

これは既知の問題ですか?

どんな助けでも本当にありがたいです。

ありがとう、

Akshay

0 投票する
3 に答える
7640 参照

java - Android: launchMode=SingleTask の問題

メイン アクティビティ (メイン メニュー) を一周するアプリがあります。他の各アプリには、このアクティビティを指示するオプション メニュー項目があります。

最初は、このアイテムを選んだときに必ず新しいメインアクティビティを開始しました。インテント バンドルを使用して、最初に行う初期化の一部は不要であることをメイン アクティビティに伝えました。

ただし、全体的な動作はあまり好きではありませんでした。たまたま見つけたのですがandroid:launchMode="SingleTask"、これが役に立ったようです。また、「戻る」ボタンを押すと、ホーム画面にまっすぐ戻ります。これは、適切な「メイン」メニューのように感じます。

私の問題はこれです:アプリの別のアクティビティを実行し、ホームボタンを押してからアプリを再度開くと(たとえば、「最後のアプリ」を使用)、最後のアクティビティには戻りませんが、メインのアクティビティに戻ります。他のアクティビティは破棄されます。

SingleTask1 つのアクティビティに戻るだけでなく、の動作を実装する方法はありますか?

0 投票する
3 に答える
792 参照

android - singleTask 使用時に各 Intent を 1 回処理する方法

インテント フィルターを指定して特定の種類のファイルを処理する singleTask-mode アクティビティを使用しています。そのようなファイルのインテントをそれぞれ 1 回だけ処理する必要があります。問題は、 onNewIntent() が呼び出されるのは、タスクが既に実行されている場合のみであり、 onCreate() からのインテントも処理する必要があります。残念ながら、onCreate() はさまざまな理由 (画面の回転など) で呼び出され、getIntent() によって返されるインテントは複数の onCreate() で同じものになる場合があります。もちろん、醜いハックを使用してこれを回避することは可能ですが、エレガントな解決策は何だろうと思っていました。これまでのところ、私が思いついた最善の解決策は、インテントを処理した後に毎回 setIntent(new Intent(Intent.ACTION_MAIN)) することです。

ありがとう!

0 投票する
1 に答える
1036 参照

android - 実行中のアクティビティを再開するにはどうすればよいですか?

私は自分自身をアプリにしました:自動ブックマーク付きの音楽プレーヤー:)

問題:

ホームページに「戻って」からアプリを再度実行しようとすると、続行したいのに新しいインスタンスが作成されます。他のことをしている間、音楽を流したままにしておくと、アクセスできないために一時停止したり保存したりできなくなります。

失敗した解決策:

私はsingleTop、singleTask、singleInstanceを試しましたが、それらはすべて機能しません!

実行中のアプリを表示できますが([設定]>[アプリケーション]>[アプリケーションの管理]>[実行中])、「強制停止」することしかできません。「前に持ってきて」はどうですか?また、アプリを終了()すると、まだ「実行中」であることに気付きます。

このサイトはとても素晴らしくて便利で、これが私の最初の質問です:)答えを探しましたが、うまくいったものは見つかりませんでした:(

マニフェストは次のとおりです。

0 投票する
1 に答える
506 参照

android - 2番目のランチャーが常に指定されたアクティビティでアプリケーションを開くようにする方法

私のアプリケーションでは、次のマニフェストエントリを使用して、ランチャーから起動できる2番目のアクティビティを指定しました。

「メイン」アクティビティでアプリを開いてから、ホームキーを押したとします。私のアプリは引き続き実行されますが、バックグラウンドで実行されます。

その後、ユーザーはホーム画面から「ListsOfListsActivity」用のランチャーアイコンを選択します。

これにより、アプリケーションがフォアグラウンドになりますが、「ListOfListsActivity」ではなく、バックグラウンドに移動したときの現在のアクティビティ(「メイン」アクティビティなど)になります。

ユーザーが「ListOfListsActivity」を選択したが、別のリストが表示されるため、これは混乱を招きます。次に、そこに移動する必要があります。

「ListOfListsActivity」にlaunchMode="singleTask"を指定することで、これをより適切に機能させることができましたが、そのモードでは、結果の別のアクティビティ(startActivityForResult())から起動することはできず、選択するにはそれを実行できる必要がありますリスト...

質問:-アプリケーションの現在のステータスとその現在のアクティビティに関係なく、アクティビティをフォアグラウンドに強制して選択されたアクティビティにするインテントフィルターを指定するにはどうすればよいですか?