web-dev-qa-db-ja.com

Android Notification PendingIntent Extras null

通知から呼び出されたアクティビティに情報を送信しようとしていますが、アクティビティからnullを取得しています。

通知のコードは次のとおりです。

private void showNotification() {
Intent resultIntent = new Intent(this, MainActivity.class);
if (D)
    Log.d(TAG, "Id: " + Id);
resultIntent.putExtra("ineedid", deviceId);

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MeterActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
    PendingIntent.FLAG_UPDATE_CURRENT);
// Bundle tmp = resultIntent.getExtras();
// if (tmp == null) {
// Log.d(TAG, "tmp bundle is null");
// } else {
// long id = tmp.getLong("ineedid", -1);
// Log.d(TAG, "tmp id : " + id);
// }
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
    BLEMessengerService.this)
    .setSmallIcon(R.drawable.ic_action_search)
    .setContentTitle("Event tracker")
    .setContentText("Events received").setOngoing(true)
    .setContentIntent(resultPendingIntent)
    .setWhen(System.currentTimeMillis());

int mId = R.string.service_notification_start_service;
mNM.notify(mId, mBuilder.getNotification());
}

メインアクティビティの意図から情報を取得するためのコード。

Bundle extras = getIntent().getExtras();
if (extras != null) {
    long deviceID = getIntent().getLongExtra("ineedid",
        -1);
    if (ID == -1) {
    if (D)
        Log.i(TAG_D, "Wrong Id received.");
    finish();
    } else {
    device = dataSource.getDeviceByID(deviceID);
    if (D)
        Log.i(TAG_D, "Get the id.");
    }
} else {
    if (D)
    Log.d(TAG_D, "Bundle is null");
    finish();
}

通知が通知される前に確認しました。バンドルはnullではなく、エクストラにIDがあります。一方、インテントからフェッチしようとしたところ、なくなってしまいました。助けて。

40
antonio081014

答えが出ました。次の行を追加してください:resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

注意:resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);として追加した場合、機能しません。

「FLAG_ACTIVITY_NEW_TASK」や「FLAG_ACTIVITY_RESET_TASK_IF_NEEDED」のような他のフラグも試しました。ここではどちらも機能しません。

12
antonio081014

pendingIntentでは、このフラグを使用してくださいPendingIntent.FLAG_UPDATE_CURRENTそれは私にとっては仕事です

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
47

私にとっては、Intent.FLAG_ACTIVITY_SINGLE_TOPを設定することに加えて、インテントに一意のアクションを追加する必要がありました。

    Intent resultIntent = new Intent(caller, NotificationActivity.class);

    String xId = getNextUniqueId();
    resultIntent.putExtra("x_id", xId);
    resultIntent.setAction(xId);
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

.. setAction(..)がなければ、Extrasは、NotificationActivityが受け取ったインテントでnullになります。

この投稿はそれを説明するのに役立ちます: https://stackoverflow.com/a/3128271/2162226

29
Gene Bo

アクティビティが開始されたとき(最初に開始されたとき)または再起動されたとき(スタックの最上位に移動されたとき)、getIntent().getExtra()nullを返しません。しかし、アクティビティがスタックのの一番上にある場合、PendingIntentを使用してそのアクティビティを開始しても、アクティビティは再起動されません。 (onCreate()は呼び出されません)代わりにonResume()が呼び出されます。そしてgetIntent().getExtra()は、アクティビティを開始したインテントに関連付けられている値(null)を返します。
インテントを更新するには、次の手順を実行します:

1)。インテントで_FLAG_ACTIVITY_SINGLE_TOP_フラグと_FLAG_ACTIVITY_CLEAR_TOP_フラグを設定します。

resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

2)。 onNewIntent()が呼び出されるアクティビティでgetIntent().getExtra()をオーバーライドします。このメソッドは_FLAG_ACTIVITY_SINGLE_TOP_によって呼び出されます

_@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
_

詳細情報: このドキュメントを参照

8
Neeraj Sewani

同じ問題が発生したとき、Unityのローカル通知プラグインで作業していた->アプリを起動し、ローカル通知をスケジュールし、アプリをバックグラウンドに送信し、ローカル通知が表示され、クリックするとアプリが再開され、getIntent().getExtras()nullでした。

私の場合、問題はエクストラを間違った意図で取得しようとしていたことでした。単純なtoStringを使用して、作成時と取得時にインテントを印刷して、受信したものが期待どおりであることを確認してください。

onNewIntent メソッドもご覧ください。

1
jbourne