2

アクティビティが 2 つだけの単純なアプリケーションを開発しています。

  • アクティビティ C はアプリケーションを構成します
  • 何らかのイベントが発生したときにユーザーと対話するためのアクティビティ A

ユーザーが一方から他方に移動することはできません。これが、私がそれらを独立したアクティビティと呼ぶ理由です。さらに、アクティビティ A はフォーム イベントのみで呼び出されているため、ユーザーが手動で実行する方法はありません。

問題。アプリケーションが適切に構成されていると仮定しましょう。システムで何らかのイベントが発生したため、アプリケーション A がユーザーに表示されています。ユーザーはそれを操作し、アクティビティはバックグラウンドになります。次に、ユーザーは構成アクティビティ C を起動することを決定します。アクティビティ C がユーザーに表示されます。ユーザーは戻るボタンを使用してアクティビティを「閉じます」が、Android ランチャーまたはデスクトップの代わりにユーザーにアクティビティ A (履歴から取得) が表示されます。

同様のシナリオが別の方法で発生する可能性があります。C はユーザーによって使用されており、その後バックグラウンドに移行します。一部のイベントはアクティビティ A を示し、ユーザーが [戻る] ボタンを使用すると、アクティビティ A を閉じる代わりに C に移動します。

私は問題を解決しましたが、解決策はかなり汚いです。そのような問題を解決するクリーンまたは標準的な方法はありますか?

私のソリューションの一部には、1つの回答で提案されたものが含まれています:

AndroidManifest.xml のスニペット:

<activity
  android:name=".C"
  android:clearTaskOnLaunch="true"
  android:excludeFromRecents="false"
  android:launchMode="singleTask"
  ...
 >
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>
<activity
  android:exported="false"
  android:name=".A"
  android:excludeFromRecents="true"
  android:noHistory="true"
  android:launchMode="singleInstance"
  android:clearTaskOnLaunch="true"
  ....
>
</activity>

アクティビティ A のスニペット:

public boolean onKeyUp(final int p_keyCode, final KeyEvent p_event) {
    switch(p_keyCode) {
        case KeyEvent.KEYCODE_ENDCALL:
        case KeyEvent.KEYCODE_HOME:
        case KeyEvent.KEYCODE_BACK:
        case KeyEvent.KEYCODE_MUTE:
        case KeyEvent.KEYCODE_POWER:
            this.finish();
            break;
        ....
    }
    return super.onKeyUp(p_keyCode, p_event);
}

イベント ハンドラから抜粋:

public class H extends BroadcastReceiver {
...
  Intent intent = new Intent(p_context, A.class);
  intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
  intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  p_context.startActivity(intent);
...
}

それは私のアプリケーションで機能します。ただし、アプリケーション (アクティビティ C) を最近のアプリケーションに表示したいです。ただし、アクティビティ A が呼び出されると、アプリケーションはRecentから削除されます。

4

1 に答える 1

3

これが最もクリーンな方法かどうかはわかりませんが、void onBackPressed()アクティビティ メソッドをオーバーライドできます。このようにして、次のように手動でアクティビティをバックグラウンドに移動し、前のアクティビティが飛び出さないようにすることができます。

public void onBackPressed () {
    moveTaskToBack (true);
}

編集:これを行うためのより良い方法があることがわかりました:

を開き、AndroidManifest.xml各宣言内に次のように記述します: `android:noHistory="true"`。そうすることで、アクティビティが履歴を残さないことを Android に伝えることができます。したがって、ユーザーが戻ってきたときに Android はアプリケーションを終了します。これは、他に戻るアクティビティがないためです。

于 2012-12-04T11:02:40.350 に答える