web-dev-qa-db-ja.com

バックグラウンド状態を再開するのではなく、ルートアクティビティからアプリが常に新しく起動する(既知のバグ)

これらのリンクで言及されている問題にまさに直面しています。

http://code.google.com/p/Android/issues/detail?id=237

http://groups.google.com/group/Android-developers/browse_thread/thread/77aedf6c7daea2ae/da073056831fd8f3?#da073056831fd8f

http://groups.google.com/group/Android-developers/browse_thread/thread/2d88391190be3303?tvc=2

LAUNCHERおよびMAINインテントとnothing elseを使用した単純なルートアクティビティがあります。マニフェストにフラグや特別なものは何もないで別のアクティビティを開始します。

アプリ(ルートアクティビティ)を起動し、そこから2番目のアクティビティを開始します。ホームボタンを押すと、タスクはバックグラウンドに移動します。アプリを再度起動すると(ランチャーから、または最近のアプリのホームボタンを押したまま)、既存のスタックの上にルートアクティビティの新しいインスタンスが開始されます。

[戻る]ボタンを押すと、新しい「ルート」アクティビティが閉じ、古い2番目のアクティビティが表示されます。つまり、タスクを前面に表示する代わりに同じタスクでルートアクティビティを起動します。

これに対抗するために、ルートアクティビティの起動モードsingleTaskを作成しました。ホームを押してアプリを再度起動すると、2番目のアクティビティが前面にある古いタスク全体を移動するのではなく、古いルートタスクの上のアクティビティをクリアし、古いルートタスクをフォアグラウンドに移動します。古いルートタスクはアプリケーションの状態を保持していることに注意してください。つまり、新しいインスタンスではありませんでしたが、より高いアクティビティは強制終了されました。

市場からダウンロードされた他のアプリケーションでも発生します。手動インストール方法は効果がありませんが、同じ方法で起動します。

47
Monstieur

これは、アプリの起動に使用されるインテントが異なるためです。 Eclipseは、アクションもカテゴリも持たないインテントを使用してアプリを起動します。ランチャーは、Android.intent.action.MAINアクションとAndroid.intent.category.LAUNCHERカテゴリーを持つインテントを使用してアプリを起動します。インストーラーは、Android.intent.action.MAINアクションでアプリを起動しますが、カテゴリはありません。

バグを送信した人は、おそらくEclipseがランチャーのふりをし、ランチャーと同じ意図を使ってアプリを起動できるようにしたいと考えているため、Eclipseプラグインの機能強化のリクエストとしてそれを言う必要があります。

25
Lance Nanek
    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
        // Activity was brought to front and not created, 
        // Thus finishing this will get us to the last viewed activity 
        finish(); 
        return; 
    } 

    // Regular activity creation code... 
} 
62
Sachin Gurnani

解決策は次のとおりです。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 & getIntent().getExtras() == null) {
        finish();
        return;
    }

 Your code....
}

編集:新しいインテントと通知に問題がありました。以前のソリューションは、通知とインテントでは機能しません...

5
toni

次のように、ランチャーアクティビティのonCreateメソッドにこれを追加するだけです。

      @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    if (!isTaskRoot()) {
        finish();
        return;
    }
    // other function
    }
1
Amal Kronz

Xamarin.Androidの同様のソリューション:

if (!IsTaskRoot)
            {
                string action = this.Intent.Action;
                if (this.Intent.HasCategory(Intent.CategoryLauncher) && !string.IsNullOrEmpty(this.Intent.Action) && action == Intent.ActionMain)
                {
                    Finish();
                    return;
                }
            }
0
CDrosos