9

ランチャー アクティビティのインテントに問題があります。シナリオは次のとおりです。 1. インテント フォーム通知サービスをランチャー アクティビティに送信する

PendingIntent contentIntent = PendingIntent.getActivity(this, TripLoggerConstants.PENDING_TRIPS_NOTIFICATION_ID, new Intent(this, MainActivity.class).putExtra("is_log", true), Intent.FLAG_ACTIVITY_CLEAR_TOP);

2. MainActivity で、この意図を取得します。コードは次のとおりです。

if(this.getIntent().getExtras()!=null){

        boolean isLogNewTripScreen  = (boolean)this.getIntent().getExtras().getBoolean("is_log");

    }
    }

3.これは正常に機能しますが、通知サービスから来たとき、通知サービス以外から起動したとき、インテント内のデータはまだそこにあります.インテントからそのデータを削除するにはどうすればよいですか.

4

4 に答える 4

35

編集: この問題と考えられる解決策をテストするサンプル アプリケーションを作成しました。ここに私の発見があります:

エクストラを含む通知からアプリを起動し、後で最近のタスクのリストからアプリを選択してアプリに戻った場合、Android は通知から起動されたのと同じ方法で (つまり、エクストラを使用して) アプリを再度起動します。これは、誰に尋ねるかによって、バグまたは機能のいずれかです。

この状況に対処するには、追加のコードを追加する必要があります。私は2つの提案を提供できます:

1.使用FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

通知を作成するときに、 にフラグIntent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTSを設定しますIntent。次に、ユーザーが通知を選択し、通知からアプリを起動すると、最近のタスクのリストにこのタスクのエントリが作成されません。また、このアプリケーションの最近のタスクのリストにエントリがあった場合、そのエントリも削除されます。この場合、ユーザーは最近のタスクのリストからこのタスクに戻ることができなくなります。これにより、ユーザーが最近のタスクのリストからアプリを起動する可能性がなくなります (ただし、アプリが通知から起動された場合のみ)。

2.検出するFLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

ユーザーが最近のタスクのリストからアプリを起動すると、Android は起動アクティビティの に渡されるフラグIntent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORYを設定します。このフラグの存在を検出すると、通知からではなく、最近のタスク リストからアプリが起動されたことがわかります。この場合、エクストラにまだデータが含まれているという事実を無視することができます。IntentonCreate()onCreate()Intent

アプリケーションのワークフローに最適なソリューションを選択してください。そして、質問をありがとう、これは解決するための興味深い課題でした:-)


追加情報:

PendingIntentを間違って作成しています。あなたが呼んでいます

PendingIntent contentIntent = PendingIntent.getActivity(this,
        TripLoggerConstants.PENDING_TRIPS_NOTIFICATION_ID,
        new Intent(this, MainActivity.class).putExtra("is_log", true),
        Intent.FLAG_ACTIVITY_CLEAR_TOP);

Intent.FLAG_ACTIVITY_CLEAR_TOPに 4 番目のパラメータとして渡していますgetActivity()。ただし、そのパラメーターはPendingIntentフラグである必要があります。に設定FLAG_ACTIVITY_CLEAR_TOPする場合は、次のIntentようにする必要があります。

PendingIntent contentIntent = PendingIntent.getActivity(this,
        TripLoggerConstants.PENDING_TRIPS_NOTIFICATION_ID,
        new Intent(this, MainActivity.class).putExtra("is_log", true)
        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), 0);
于 2013-11-06T18:37:18.450 に答える
0

android:launchMode="singleInstance" をランチャー アクティビティに追加し、アクティビティの開始時に Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS フラグを使用します

于 2021-05-06T17:16:54.930 に答える