22

アクティビティナビゲーションとバックスタックに問題があり、解決してくれることを期待していました。

問題

ルートアクティビティ>>>SecondActivity>> HomeButton

次に、ホームページに移動し、そこから選択します...

Gmail>>メッセージ>>アプリケーションで添付ファイルを開く>>ImportActivity>> RootActivity

その結果、新しいタスクが開始され、アプリケーションの別のインスタンスが使用されます。2つの別々のタスクを実行したくないので、これは受け入れられません。1つだけが必要です。

望ましい結果

私がしたいのは、ユーザーが添付ファイルを開き、ImportActivityが実行を終了して(android:noHistorytrueに設定されている)呼び出しstartActivity(intent)RootActivity開始したときに開始されますが、元のタスクでは1つのインスタンスと残りのアクティビティのみがその上に保持されます(この場合SecondActivity)は削除されます。

これが必要な理由は、ユーザーがファイルをインポートした後にアプリケーションから移動し、アプリアイコンをタッチすると、最初のタスクがバックスタックとともに読み込まれ、ユーザーが2つの異なる部分にいることができる2つのタスクが実行されている場合です。すぐに私のアプリケーション。

私が試したこと

起動モードで遊んだことがありますが、どれも必要な機能を実際に提供してくれません。

私が試した起動モード。

android:launchMode = "singleTask" -これは、起動されるたびにルートアクティビティを再開しました。ユーザーがアプリケーション内のホームボタンを押してアプリアイコンをタッチしても、バックスタックは破棄されました。

android:launchMode = "singleInstance =は、他のアクティビティをタスクで実行することを許可しません。

また、開始するインテントを呼び出すとき、RootActivity私は役に立たないために以下を使用しました。

Intent i = new Intent(ImportActivity.this,TrackingActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);

私がやりたいことをすることは可能ですか?

前もって感謝します

4

3 に答える 3

5

あなたは言う

Gmail >> Message >> Open attachment in my application >> ImportActivity >> RootActivity

しかし、それは正しくないかもしれません。この状況では、gmail はアプリ内の をIntent対象としたを発行ImportActivityします。ImportActivity実行します。ただし、https:ImportActivity //developer.android.com/guide/components/tasks-and-back-stack.html を読んだところ、gmail と同じタスクの一部として実行され、バックスタックの上に配置されることが示唆されています。マニフェストで特別な手順を実行してそれを防止するか、gmail が個別のタスクとして明示的に呼び出す場合を除き、gmail タスクの場合。ImportActivity終了したら、呼び出す必要はありませんが、呼び出すstartActivity(intentForRootActivity)だけfinish()で破棄され、バックスタックでその下にある gmail からのアクティビティが表示されます。

ImportActivity呼び出しstartActivity(intentForRootActivity)た場合RootActivity、gmail タスクの一番上に移動し、gmail バックスタックに表示されます。タッチhomeしてから gmail のランチャー アイコンを表示するとRootActivity、gmail がその下に隠れて再表示されます。

android:launchMode="standard"のマニフェスト宣言で必要だと思いますImportActivity

アプリの古いスタンドアロン インスタンスを表すタスクは変更されません。誰かがアプリのランチャー アイコンに触れると、アプリの古い状態が復元され、gmail タスクで何が起こっても影響を受けません。

ドキュメントhttp://developer.android.com/guide/components/processes-and-threads.htmlは、アクティビティがここでプロセスにどのようにマップされるかについてかなり曖昧です (David Wasser がこの回答の以前のバージョンについてコメントする原因となります)。 gmail のアクティビティは、ある Linux ユーザー ID を使用して 1 つの Linux プロセスでImportActivity実行され、別のユーザー ID を使用して別の Linux プロセスで実行されます。ただし、それらはすべて、1 つのバック スタックを持つ 1 つのタスクの一部を形成できます。

ImportActivitygmail タスクの一部として、スタンドアロン アプリの一部として実行された場合と同じ有効な Linux ユーザー ID で実行されますが、gmail が実行される Linux ユーザー ID とは異なります。これはありそうもなく複雑に聞こえますが、https://developer.android.com/guide/components/fundamentals.htmlによって暗示されているようです。それは理にかなっている; たとえば、アプリに保存されているユーザー設定を取得する必要がある場合ImportActivityは、設定ファイルを、gmail に定義されたユーザーではなく、アプリに定義されたユーザーであるかのように読み取る必要があります。

私はこれを実行しようとはしていません。スティックの完全に間違った端を持っていたら、誰かがすぐに教えてくれるでしょう!

于 2012-12-17T15:05:02.343 に答える
1

これを行うために特別なものは必要ありませんlaunchMode。インポート アクティビティがIntent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOPこれでルート アクティビティを起動する場合、必要なことが行われます。に問題があると思いますtaskAffinity。これを試して:

マニフェストで、importActivity の宣言にこれを追加します。

android:taskAffinity=""

これで問題が解決しない場合は、マニフェストを投稿して確認してください。

于 2012-12-17T16:48:01.737 に答える
0

私がそれを取得したかどうかは本当にわかりませんが、余分なアプリケーションスタックを失うことなく「ルート」アクティビティに移動したい場合は、Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPのフラグに直接アクセスしintent、追加の構成はありませんManifest...説明したように使用できるものよりも新しい完全な新しいスタックを作成するには、タスクを分離する必要がありますIntent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP

于 2012-12-12T19:46:41.447 に答える