15

私のAndroidアプリには、アプリケーションへのエントリポイントとして機能するメインアクティビティがあります。これは、マニフェストファイルで次のように構成されています。

<activity android:name=".Main"
              android:label="@string/app_name"
              android:screenOrientation="portrait"
              android:alwaysRetainTaskState="true"
              android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

したがって、特定のユースケースでは、ユーザーがアプリケーションランチャー内のアイコンをクリックしてホーム画面からアプリを起動するとします。アプリを起動した後、ユーザーはメインアクティビティからアクティビティAに移動し、最後にアクティビティBに移動します。この時点で、ユーザーはFacebookを確認することにしたので、ホームボタンをクリックしてアプリをバックグラウンドに置き、起動します。 Facebookアプリ。

Facebookを確認した後、ユーザーは私のアプリに戻りたいので、ホームキーを押して、アプリケーションランチャーからアプリケーションを起動します(最初に起動したときと同じように)。

ユーザーがアプリに戻ったときに、アプリがバックグラウンドに置かれたときにユーザーが最後に行ったアクティビティ(この場合はアクティビティB)にアプリを戻すようにします。マニフェストファイルでは、alwaysRetainTaskState=trueを設定しました。 OSが私のアプリのアクティビティを強制終了しないようにするため。

さて、私の質問です。上記の動作をどのように取得しますか?アプリのアイコンをクリックすると、何があっても常にメインアクティビティから始まります。これはcategory.LAUNCHER属性によるものだと思います。android:launchMode = singleTaskを試しましたが、違いはありません。常にメインから始まります。

誰かがインテントフィルター、起動モード、およびタスクを明確にすることができれば、それは素晴らしいことです!

4

3 に答える 3

9

FYIsingleTaskは新しいタスクを開始するため、あなたが望むものではありません。

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

アクティビティBをどのように開始しますか?非標準の起動モードまたはインテントフラグはありますか?

于 2010-01-13T19:12:46.157 に答える
7

同様の問題を抱えてここに来る人のために、私はあなたが見ているものかもしれない何か奇妙なものを見つけました...多分。

アクティビティA->B->Cなどのアプリがあるとします。アプリリスト(ランチャー)から起動した場合、アプリが常にAに「再開」するという問題が発生していました。「再送」画面から再開すると(ホームプレスを長押し)、正しい再開動作が表示されます(期待どおりにBまたはCに再開します)。マニフェストは特別なものではなく、rootアクティビティにalwaysRetainTaskState = "true"が設定されており、起動モードはデフォルト(標準)です。

私はウェブサイトを介して私の電話にapkをロードしていました。ダウンロードしてインストールした後、「開く」を押してすぐにアプリを起動します。なんらかの理由で(アプリをアンインストールした後)再度ダウンロードしてインストールするのに疲れましたが、代わりに「完了」ボタンを押しました。次に、ランチャー/「すべてのアプリ」リストからアプリを起動すると、最近の再開と同じ再開動作になります。つまり、「完了」ではなく「開く」をクリックした場合のインストールプロセスが原因で、問題が発生していました。

API10(2.3.5)とAPI15(4.0.4)でこの「ソリューション」を検証しました

于 2012-11-05T10:36:57.233 に答える
3

スクリーンレスDispatcherActivityを追加してデフォルトにすることでこれを解決しました(まったく同じインテントフィルターを使用します)。そのonCreateメソッドでは、適切なデフォルト(たとえば、メインアクティビティ)に基づいて、または開始するアクティビティを識別する保存されたトークンに基づいて、インテントを作成して呼び出します。onStopそのトークンは、再起動時に呼び出すアクティビティのメソッドに保存/更新されます。このトークンを設定に保存できます。

ここでの理論的根拠は、表示されていた最後のアクティビティが中断されたときにonStopメソッドを実行するということです。

ここでの注意点:私はこのパターンを実装しましたが、それはかなりうまく機能しました。しかし、それは歴史とあまりうまく機能していないようで、最終的に私はあきらめてこのコードをヤンクしました。これまで誰も文句を言いませんでした。

于 2010-01-13T19:10:17.817 に答える