2

Androidドキュメントによると:

http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html

「ユーザーがホームボタンを押してタスクを終了すると、現在のアクティビティが停止し、そのタスクがバックグラウンドになります。システムは、タスク内のすべてのアクティビティの状態を保持します。ユーザーが後でランチャーアイコンを選択してタスクを再開した場合それがタスクを開始すると、タスクはフォアグラウンドになり、スタックの一番上でアクティビティを再開します。」

私がこれを正しく理解している場合、これは次のことを意味します。

  1. メインアクティビティとしてのアクティビティA。
  2. 「startActivity」を介してAで開始されるアクティビティB-一般的なプレーンインテントインスタンス。
  3. 初めてアプリを開くと、Aが読み込まれます。
  4. Aのボタンをクリックすると、Bはオープンエンドです。
  5. ホームボタンを押します。
  6. もう一度アプリを開くと、Bが表示される予定です

...右?これは予想される正しい動作だと思います...

ただし、これはアプリに表示されません。

「ホームボタン」を押してからアプリを再開すると、ランチャーアイコンを押して、メインのアクティビティから開始します。一番上のアクティビティや最新のアクティビティではありません。

私はSamsungGalaxyTab Android 2.2.1でコーディングしています-Androidマニフェストで最も一般的なオプションがあります-さまざまなインテントエクストラを使用して10の異なるアクティビティを処理し、ディスパッチャークラスのアプローチを使用します-または各アクティビティの状態を保存します-かなり厳しいですね。

私はEclipseIDEをADTバージョン12で使用しています。そして私は非常に興味深いものを見つけました:

デバイスを接続した状態でEclipseIDEからアプリを実行すると、この動作は見られません。アプリはドキュメントに記載されているように動作します。実際、これは、apkをGooglePlayアプリリポジトリにデプロイした後でのみ見られました。それをダウンロードしてテストしました。

私の質問は、これが起こっている本当の理由を誰かが見つけたということです。ドキュメントは間違っていますか?または何かが足りない?これはAndroidのバグですか?

私が行った別の研究は次のとおりです。

Google PlayからダウンロードしたアプリをAPKとして試してみると、アプリを2回目に入力すると、最後のオープンエンドではなく「メイン」アクティビティが表示されます。家に押します。ホームを押した後、Androidのアプリケーション管理設定を入力し、アプリを見つけて[強制停止]をクリックします。これを行った後、アプリはドキュメントに記載されているように動作します。

誰か助けて!:)

4

3 に答える 3

9

これはAndroidのプラットフォームのバグです:

http://code.google.com/p/android/issues/detail?id=2373

回避策は、これをメインアクティビティの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))
    {
        Log.w(LOG_TAG, "Main Activity is not the root.  Finishing Main Activity instead of launching.");
        finish();
        return;       
    }
}

から抽出されたもの:

異なる意図で起動されたときにアクティビティの複数のインスタンスを防ぐ方法

...これを探して3日間過ごしました。

于 2012-06-14T22:21:26.783 に答える
2

失敗する理由と、このバグをプログラムで再現して、これをテストスイートに組み込む方法について説明します。

  1. EclipseまたはMarketAppを介してアプリを起動すると、インテントフラグFLAG_ACTIVITY_NEW_TASKで起動します。

  2. ランチャー(ホーム)を介して起動する場合、フラグを使用します。FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDEDであり、アクション「MAIN」とカテゴリ「LAUNCHER」を使用します。

これをテストケースで再現する場合は、次の手順を使用します。

adb shell am start -f 0x10000000 -n com.testfairy.tests.regression.taskroot/.MainActivity 

次に、他のアクティビティに到達するために必要なことは何でもします。私の目的のために、私は別のアクティビティを開始するボタンを配置しました。次に、次のコマンドを使用してランチャー(ホーム)に戻ります。

adb shell am start -W -c android.intent.category.HOME -a android.intent.action.MAIN

そして、これを使用してランチャーを介して起動をシミュレートします。

adb shell am start -a "android.intent.action.MAIN" -c "android.intent.category.LAUNCHER" -f 0x10600000 -n com.testfairy.tests.regression.taskroot/.MainActivity

isTaskRoot()の回避策を組み込んでいない場合、これにより問題が再現されます。自動テストでこれを使用して、このバグが二度と発生しないことを確認します。

お役に立てれば!

于 2014-04-05T15:10:17.823 に答える
1

ドキュメントは正しいです。これを引き起こしていると考えられる唯一の問題は、テストしているデバイスです。エミュレーター(ストックAndroid)で期待どおりに動作する場合は、Androidの少なくとも90%で動作するはずです。これは製造元の責任であり、Androidではないと思います。

于 2012-06-13T01:15:11.710 に答える