アクティビティが 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から削除されます。