56

通知から呼び出されたアクティビティに情報を送信しようとしていますが、アクティビティから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があります。一方、インテントからフェッチしようとすると、消えてしまいました。ヘルプ。

4

7 に答える 7

62

保留中のインテントでは、このフラグを使用PendingIntent.FLAG_UPDATE_CURRENTしてください。

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
于 2016-03-28T21:17:34.440 に答える
36

私の場合、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(..)がないと、NotificationActivityが受信したインテントのExtrasはnullになります。

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

于 2014-06-04T20:34:58.920 に答える
16

私はちょうど答えを得ました、行を追加してください:resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

注意:機能しないため、追加した場合resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

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

于 2012-11-28T02:01:18.230 に答える
15

アクティビティが起動されたとき(最初に開始されたとき)または再起動されたとき(スタックの一番上に移動されたとき)は、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);
}

詳細については、このドキュメントを参照してください

于 2018-09-03T21:09:38.250 に答える
1

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

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

onNewIntentメソッドも確認してください。

于 2017-10-17T13:42:22.303 に答える
0

暗黙のインテントを使用してPendingIntentを構築している場合、この問題が発生する可能性があります。

問題のある以前のアプローチ。

val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse("deeplink or applink here")
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
intent.putExtra("key", Parcelable)
PendingIntent.getActivity(context, abs(Random.nextInt()), intent, PendingIntent.FLAG_UPDATE_CURRENT)

暗黙のインテントに基づいて、上記の複数のアプローチを試しましたが、うまくいきませんでした。


これが私の問題を解決したアプローチです。インテントを暗黙的なものから明示的なものに変更します。

// only diff
val intent = Intent(context, YourIntentDestinationActivity::class.java)
// only diff
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse("deeplink or applink here")
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
intent.putExtra("key", Parcelable)
PendingIntent.getActivity(context, abs(Random.nextInt()), intent, PendingIntent.FLAG_UPDATE_CURRENT)

これがあなたのために働くことを願っています。

于 2020-07-26T23:33:24.420 に答える
0

私の場合、Samsungデバイスはインテントから余分なものを削除し続け、アプリをクラッシュさせることさえありました。PendingIntent.FLAG_IMMUTABLEすべての組み合わせを試しましたが、この動作の実際の理由は、保留中のインテントにフラグを明示的に追加することではありませんでした。

ただし、これはAndroid12以降の要件です

val pendingIntent = PendingIntent.getActivity(
                                this, 0,
                                getIntent(),
PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE
                            )
于 2022-02-15T20:47:01.883 に答える