1. ホーム
  2. android

[解決済み] PendingIntentがIntentのextrasを送らない

2022-06-02 10:24:27

質問

私の場合 MainActicity 開始 RefreshService を持つ Intent を持つ boolean という余分な isNextWeek .

私の RefreshServiceNotification を生成し、それが私の MainActivity を開始します。

というように表示されます。

    Log.d("Refresh", "RefreshService got: isNextWeek: " + String.valueOf(isNextWeek));

    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.putExtra(MainActivity.IS_NEXT_WEEK, isNextWeek);

    Log.d("Refresh", "RefreshService put in Intent: isNextWeek: " + String.valueOf(notificationIntent.getBooleanExtra(MainActivity.IS_NEXT_WEEK,false)));
    pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    builder = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText("ContentText").setSmallIcon(R.drawable.ic_notification).setContentIntent(pendingIntent);
    notification = builder.build();
    // Hide the notification after its selected
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(NOTIFICATION_REFRESH, notification);

ご覧のように notificationIntent には boolean 余分な IS_NEXT_WEEK の値で isNextWeek に置かれる PendingIntent .

今クリックすると、この Notification をクリックすると、いつも false の値として isNextWeek

の値を取得する方法です。 MainActivity :

    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);

ログを表示します。

08-04 00:19:32.500  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity sent: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService got: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService put in Intent: isNextWeek: true
08-04 00:19:41.990  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity.onCreate got: isNextWeek: false

を直接起動すると MainActivityIntent のように、ìsNextValue`を指定します。

    Intent i = new Intent(this, MainActivity.class);
    i.putExtra(IS_NEXT_WEEK, isNextWeek);
    finish();
    startActivity(i);

はすべて正常に動作し、次のようになります。 true と表示されます。 isNextWeektrue .

が常に存在することをどう勘違いしたらいいのでしょうか? false の値があるのはなぜですか?

最新情報

これで問題が解決しました。 https://stackoverflow.com/a/18049676/2180161

引用元

私が思うに、インテントで変更されるのは エクストラであるため PendingIntent.getActivity(...) ファクトリーメソッドは は単に最適化として古いインテントを再利用しているのではないかということです。

RefreshServiceで、試してみてください。

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

ご覧ください。

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT

アップデイト2

参照 の回答を参照してください。 を使用した方が良い理由 PendingIntent.FLAG_UPDATE_CURRENT .

どのように解決するのですか?

PendingIntent.FLAG_CANCEL_CURRENT を使用することは、メモリを効率的に使用できないため、良い解決策ではありません。代わりに を使ってください。 .

こちらもご利用ください Intent.FLAG_ACTIVITY_SINGLE_TOP (アクティビティがすでに履歴スタックの最上位で実行されている場合、アクティビティは起動されません)。

Intent resultIntent = new Intent(this, FragmentPagerSupportActivity.class).
                    addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
resultIntent.putExtra(FragmentPagerSupportActivity.PAGE_NUMBER_KEY, pageNumber);

PendingIntent resultPendingIntent =
                PendingIntent.getActivity(
                        this,
                        0,
                        resultIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

では

@Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);

            int startPageNumber;
            if ( savedInstanceState != null)
            {
                startPageNumber = savedInstanceState.getInt(PAGE_NUMBER_KEY);
//so on

これで動くはずです。


それでもまだ期待した動作にならない場合は、以下のように void onNewIntent(Intent intent) イベントハンドラを実装してください。そうすれば、アクティビティのために呼び出された新しいインテントにアクセスできます (これは単に getIntent() を呼び出すのと同じではありません。

@Override
protected void onNewIntent(Intent intent) {
    int startPageNumber;

    if (intent != null) {
        startPageNumber = intent.getExtras().getInt(PAGE_NUMBER_KEY);
    } else {
        startPageNumber = 0;
    }
}