7

2 つの「モード」を持つアプリケーションを作成しています。1 つの表示モードと 1 つの編集モード。アプリケーションは、2 つのメイン/ランチャー アクティビティ (たとえば、AD ) を公開します。これらのアクティビティには、それぞれ独自のアクティビティ チェーン ( BCEF ) があります。2 つのエントリ ポイント アクティビティADは、ホーム画面に別々のラベルが付いた 2 つのアイコンを表示し、2 つのチェーンが交差することはありません。つまり、アクティビティAを使用してビュー モードでアプリケーションを起動すると、往復できる唯一のルートになります。はABCまた、アクティビティDを使用してアプリケーションを編集モードで開始した場合、使用可能なアクティビティ チェーンはDEFのみです。

さて、私の問題は、たとえばビューモード(アクティビティチェーンABC)でアプリケーションを起動し、そのチェーンの任意のアクティビティからホームボタンを押すと(もちろん)ホーム画面に戻ることです。編集モードでアプリケーションを再起動します (アクティビティ チェーンDEF ) ホーム ボタンを押したときに行っていたアクティビティ (つまり、間違ったチェーンのアクティビティ) に移動します - 予期される編集モードのエントリ ポイントではありません; アクティビティD .

これを解決するにはどうすればよいですか?

android:noHistory関連するアクティビティについて、android:clearTaskOnLaunchおよびその他の属性のさまざまな組み合わせを試しAndroidManifest.xmlました。しかし、それらはチェーン全体ではなく、アクティビティそのものに影響を与えるようです。

ホームボタンが押されたときにアクティビティのチェーン全体(ABCまたはDEF)を履歴スタックから削除したいのですが、チェーン内にいる間はスタックをそのまま保持します(たとえば、アクティビティBから [戻る] ボタンを押して、アクティビティAに移動できるようにします)。

4

3 に答える 3

4

ホームアクティビティでフラグを使用する必要があるようIntent.FLAG_ACTIVITY_CLEAR_TOPに聞こえますが、もちろん、AndroidManifest.xmlファイルにこれらのフラグを追加することはできません。たぶん、正しいエントリポイントを起動する単一のエントリポイントが必要です。アクティビティエイリアスActivityを使用して、ユーザーにとって2つのエントリポイントのように見せることができます。

たとえば、マニフェストファイルでアクティビティを定義します。

   <activity-alias
        android:label="@string/edit_app_name"
        android:name="launch_edit"
        android:targetActivity=".activities.LaunchActivity">
        <meta-data android:name="launch_type" android:resource="@string/launch_edit" />
    </activity-alias>
    <activity-alias
        android:label="@string/view_app_name"
        android:name="launch_view"
        android:targetActivity=".activities.LaunchActivity">
        <meta-data android:name="launch_type" android:resource="@string/launch_view" />
    </activity-alias>

次に、LaunchActivityには次のものがあります。

ActivityInfo activityInfo = getPackageManager().getPackageInfo( this.getComponentName(), PackageManager.GET_ACTIVITIES|PackageManager.GET_META_DATA);
int launchTypeResource = activityInfo.metaData.getInt("launch_type");
String launchType = context.getString(launchTypeResource);
if(launchType == null) {
   // handle error
   throw new Exception();
}
Intent newIntent;
if(launchType.equals(context.getString(R.string.launch_view)) {
    newIntent = createIntent(ViewActivity.class);
} else if(launchType.equals(context.getString(R.string.launch_edit)) {
    newIntent = createIntent(EditActivity.class);
}
newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(newIntent);
于 2012-01-06T12:40:45.807 に答える
4

ホームボタンを押したら、次の方法を使用してください。

Intent intent=new Intent(this, HomeClass.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
于 2012-01-06T12:44:12.420 に答える
1

Activity各チェーンに1 つだけを使用することを検討できます(つまり、 ADのみになります)。

次に、 ABCおよびDEFのコンテンツをフラグメントとして実装しActivity、前後に移動するときに表示されるフラグメントを変更するだけです。

これを組み合わせるとandroid:noHistory、目的の効果が得られるはずです。ただし、Honeycom 以下のバージョンをターゲットにする場合は、いくつかの書き換えが必要であり、プロジェクトに互換性パッケージを含める必要があります。

于 2012-01-06T12:59:36.357 に答える