7

私はインテント フラグにあまり詳しくないので、ご容赦ください。

ViewPager でデータベースからのものを表示するアプリケーションを実行しています。また、時々ランダムな行を引き出して表示するウィジェットもあります。クリックすると、同じコンテンツが表示されているアクティビティに移動し、アクションを実行できるようになりました。

すべてが機能しますが、アクティビティが既に実行されているときにウィジェットをクリックすると、新しいインスタンスが作成されたように見えます。[戻る] ボタンを押すと、アプリケーションを終了するのではなく、前のインスタンスまたは何かに移動するからです。

アクティビティの新しいインスタンスを開始する方法はありますか?以前のインスタンスがいくつか実行されていた場合、フラグを使用してそれらを閉じますか?

CLEAR_TOP などをいじってみましたが、正直なところ、自分が何をしているのかわかりません。

ありがとう!

//編集

Intent.FLAG_ACTIVITY_CLEAR_TOP は何もしていないようです。Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP は、前のものを一番上に持ってくるようで、新しいものか何かを無視します。言い換えると、ランチャー アイコンからアクティビティを開始し、ホーム ボタンを押してウィジェットをクリックすると、ViewPager.setCurrentItem が正しいページを設定する新しいインスタンスが表示されます (ウィジェットと同じ)。前にメイン アクティビティが実行されていない場合は問題ありませんが、実行されていた場合は終了します。

MyWidgetProvider extends AppWidgetProvider

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    Log.d("MainActivity", "MyWidgetProvider # onUpdate");

    for (int i = 0; i < appWidgetIds.length; i++) {
        int appWidgetId = appWidgetIds[i];

        Intent intent = new Intent(context, MainActivity.class);
        intent.putExtra("from_widget", true);
        //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        views.setOnClickPendingIntent(R.id.widget_container, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

}
4

3 に答える 3

10

これを行うにはいくつかの方法があります。新しいインスタンスを作成し、現在のインスタンスを閉じる場合 (アクティビティ スタックの一番上にあると仮定) を設定する必要がありますIntent.FLAG_ACTIVITY_CLEAR_TOP

もう 1 つの方法は、アクティビティの同じインスタンスが既にスタックの一番上にある場合、それを再利用することです。この場合、 と の両方を設定する必要があります 。これを行うと、Android はアクティビティの別のインスタンスを作成しませんが、アクティビティを呼び出して新しいインテントを配信します。Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_SINGLE_TOPonNewIntent()

于 2012-12-17T10:24:19.007 に答える
3

その他の閉鎖フラグを立てる、

Intent.FLAG_ACTIVITY_CLEAR_TOP

新しいインスタンスにフラグを立て、

Intent.FLAG_ACTIVITY_NEW_TASK
于 2012-12-17T10:30:44.777 に答える
0

私の要件は、新しいインスタンスでアクティビティ (AbcActivity) を開始し、同じアクティビティ (AbcActivity) の他のインスタンスがあればそれを閉じ、上部の他のアクティビティ (ある場合) も閉じることでした。私のために働いた解決策は次のとおりです。

startActivity(new Intent(MainActivity.this,AbcActivity.class)
            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
于 2016-08-10T05:52:44.020 に答える