56

これはよくある問題のようで、すでに見つけた関連するすべての質問を調べました: アクティビティが新しいインテントを取得していないなぜ余分なデータ (整数) がアンドロイド通知インテントで送信されないのですか? 通知は古いインテント エクストラを渡します。インテントのエクストラを通知に入れることはできません。android 保留中のインテント通知の問題です。しかし、まだこれを理解できません。

問題は同じです。追加情報を含む PendingIntent を使用して通知を設定しましたが、反対側でそれを取得できません。

通知を生成するコードは次のとおりです。

Notification notification = new Notification(R.drawable.icon, getResources().getString(R.string.notification_ticker), System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;

Intent start_test = new Intent(this, MyActivity.class);
start_test.putExtra("start_test", true);
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent pi = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), start_test, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(this, getResources().getString(R.string.notification_title), getResources().getString(R.string.notification_content, expired), pi);
nm.notify(NOTIFICATION_ID, notification);

そして反対側では:

boolean start_test=getIntent().getBooleanExtra("start_test", false);

バンドルは実際にはありません (getExtras() は null を返します)。

PendingIntent.getActivity( FLAG_UPDATE_CURRENTFLAG_CANCEL_CURRENT、 )のさまざまなフラグを試しましたがFLAG_ONE_SHOT、どれも役に立ちませんでした。

コードに示されているように、getCurrentMillis を使用して requestID が変更されていることを確認します。

また、MyActivity で、onCreate呼び出さonNewIntentれていないこともわかりました。のみonResumeです。がセットされているのにFLAG_ACTIVITY_NEW_TASK…?

非常に単純なものが欠けていますか?

4

7 に答える 7

56

通知インテントの設定FLAG_ACTIVITY_NEW_TASKにより、次のことが発生します。

  • アクティビティがまだタスクで実行されていない場合、新しいタスクが開始され、インテントがアクティビティに配信されます。onCreate()

  • ただし、アクティビティがタスクで既に実行されている場合、そのタスクはフォアグラウンドに移動します。それで全部です。インテントは配信されonNewIntent()、呼び出されません。

インテントを実際に配信したい場合は、次を指定する必要があります。

start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);

アクティビティの がそうであるかどうかに関係なく、インテントで指定する必要があります。launchModesingleTopIntent.FLAG_ACTIVITY_SINGLE_TOP

注:アクティビティがタスクで既に実行されていて、アクティビティがそのタスクのアクティビティ スタックの一番上にない場合、タスクはフォアグラウンドに移動されます。それで全部です。インテントは配信されません。これを実現する唯一の方法はIntent.FLAG_ACTIVITY_CLEAR_TOP、他の 2 つのフラグに追加することですが、これは実現したくない場合があります (特定のシナリオによって異なります)。

http://code.google.com/p/android/issues/detail?id=17137で、Google コードに関する私の (まだ) 未解決の問題を参照してください。

于 2012-07-19T15:15:21.250 に答える
7
  1. 必要がない場合は、マニフェストでアクティビティを単一のタスクとして設定しないでください。可能な場合は、この行を省略するか、singleTop に変更します。

      android:launchMode="singleTask”
    
  2. 単一のタスクが必要な場合は、保留中のインテントでフラグを : Intent に設定します。FLAG_ACTIVITY_NEW_TASK | 意図。FLAG_ACTIVITY_CLEAR_TASK と PendingIntent。FLAG_CANCEL_CURRENT .

    resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK);
    pIntent = PendingIntent.getActivity(context, 0, resultIntent,    PendingIntent.FLAG_CANCEL_CURRENT );
    
  3. 単一のタスクがある場合 - onNewIntent() 内のアクティビティのエクストラをsetIntent(intent);でリセットします。

    protected void onNewIntent(Intent intent) {
           setIntent(intent);
           ... 
     }
    
于 2015-12-17T13:38:37.867 に答える
0

より単純なアプローチ: 本当の問題は、同じターゲットに対する Intent が置き換えられることです。「NotificationDismissalService」という新しいサービスを作成することで、これを解決しました。そのサービスに送信される唯一のインテントは、setDeleteIntent アイテムです。独自のサービスであるため、パラメーターは置き換えられません。NotificationDismissalService の本体 (そして、実際には一意のインテント タイプごとにそのような却下サービスの 1 つになります) は、インテントを優先サービス (正しいパラメーターの読み取り/書き込み) に送信する「onStartCommand」の単純な実装です。これはサービスの実際の送信であるため、間に保留中の意図がないため、問題なく機能します。

于 2014-02-02T03:33:14.240 に答える
0

アプリが実行されていないかバックグラウンドにあり、ユーザーがトレイの [通知] をクリックすると、追加のインテントを取得してキーを確認できます。

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("RC","MainActivity.onCreate() called");

    if (getIntent().getExtras() != null){
        Bundle extra = getIntent().getExtras();
        Log.d("RC", "MainActivity.onCreate() : keys count = " + extra.keySet().size());

        for ( String key : extra.keySet()) {
            Log.d("RC","MainActivity.onCreate() : key = " + key + " = " + extra.getString(key));
        }

    }
}

これは次のように表示されます。

D/RC: MainActivity.onCreate() called
D/RC: MainActivity.onCreate() : keys count = 8
D/RC: MainActivity.onCreate() : key = google.delivered_priority = high
D/RC: MainActivity.onCreate() : key = google.sent_time = null
D/RC: MainActivity.onCreate() : key = google.ttl = null
D/RC: MainActivity.onCreate() : key = google.original_priority = high
D/RC: MainActivity.onCreate() : key = from = 631131412302
D/RC: MainActivity.onCreate() : key = google.message_id = 0:1627370460932539%952b1da9952b1da9
D/RC: MainActivity.onCreate() : key = gcm.n.analytics_data = null
D/RC: MainActivity.onCreate() : key = collapse_key = com.reflectcode.demo.cloudmessaging
于 2021-07-27T07:38:45.870 に答える