web-dev-qa-db-ja.com

pendingIntentから起動されたIntentからのgetExtra

ユーザーがリストから時間のある何かを選択した後、いくつかのアラームを作成し、指定された時間に通知を作成しようとしています。私の問題は、インテントのputExtraがブロードキャストレシーバーで受信できない「showname」です。常にnull値を取得します。これはほとんどのインテントでこれを行う方法ですが、今回はpendingIntentまたはbroadcastReceiverが原因で何かを別の方法で行う必要があると思います。ありがとうございました

保留中のインテントを介してインテントを送信する関数

public void setAlarm(String showname,String time) {

    String[] hourminute=time.split(":");
    String hour = hourminute[0];
    String minute = hourminute[1];
    Calendar rightNow = Calendar.getInstance();
    rightNow.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour));
    rightNow.set(Calendar.MINUTE, Integer.parseInt(minute));
    rightNow.set(Calendar.SECOND, 0);
    long t=rightNow.getTimeInMillis();
    long t1=System.currentTimeMillis();

    try {   

    Intent intent = new Intent(this, alarmreceiver.class);  
    Bundle c = new Bundle();            
    c.putString("showname", showname);//This is the value I want to pass
    intent.putExtras(c);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 12345, intent, 0);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis(),pendingIntent);
    //Log.e("ALARM", "time of millis: "+System.currentTimeMillis());
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

    } catch (Exception e) {
        Log.e("ALARM", "ERROR IN CODE:"+e.toString());
    }
}

そして、これは受信側です

public class alarmreceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();      
    Bundle b = intent.getExtras();
    String showname=b.getString("showname");//This is where I suppose to receive it but its null
    NotificationManager manger = (NotificationManager) context
            .getSystemService(context.NOTIFICATION_SERVICE);

    Notification notification = new Notification(R.drawable.icon,
            "TVGuide Υπενθύμιση", System.currentTimeMillis());
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            new Intent(context, tvguide.class), 0);

    notification.setLatestEventInfo(context, "Το Πρόγραμμα Ξεκίνησε",
            showname, contentIntent);

    notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;

    notification.sound = Uri.parse("file:///sdcard/dominating.mp3");
    notification.vibrate = new long[]{100, 250, 100, 500};
    manger.notify(1, notification);
}           
}
38
spagi

インテントのExtraの値を変更する場合は、保留中のインテントを作成するときに、フラグPendingIntent.FLAG_CANCEL_CURRENTを使用する必要があります。

簡単な例は

PendingIntent pi = PendingIntent.getBroadcast(context, 0,intentWithNewExtras,PendingIntent.FLAG_CANCEL_CURRENT);

これは正しい方法であり、新しい値が確実に提供されるようにします。

それが役に立てば幸い。

52
Priyank

インテントは、コンテキストやアクションが異なる場合を除き、システムで再利用されます。 ドキュメントリンク 。つまり、インテントをすでに作成している場合は、そのインテントも後で使用される可能性があります。

デバッグテストとして、intent.setAction("" + Math.random())の下にintent.putExtras(c)を追加して、相手側でエクストラが受信されるかどうかを確認できます。

関連ドキュメント

この動作のため、PendingIntentを取得するために、2つのインテントが同じであると見なされる場合を知ることが重要です。よくある間違いは、「追加の」コンテンツのみが異なるIntentsを使用して複数のPendingIntentオブジェクトを作成し、毎回異なるPendingIntentを取得することです。これは起こりません。マッチングに使用されるインテントの部分は、Intent.filterEqualsで定義されているものと同じです。 Intent.filterEqualsごとに同等の2つのIntentオブジェクトを使用すると、両方に同じPendingIntentが取得されます。

24
aioobe

同じアラーム時間の上書きを回避するために、異なるアラーム通知に異なるリクエストコードを使用します。

9
Pattabi Raman

intent.putExtra()メソッドを使用する必要があります。バンドルをエクストラセグメントに設定しません。文字列を設定した場合、あなたはintent.putExtra(<key>, value);を試してみてください。使った。

0
nurisezgin

私も同じ問題を抱えていました。ここで@aioobeの提案に従ってアクションをインテントに設定することで解決しました。私のインテントは魔法のように機能します。

ここで私がしたこと

  ` intent.putExtra("Name", mName);
    intent.putExtra("dateTime", newdate);
    intent.setAction("" + Math.random());`

それが誰かを助けることを願って、幸せなコーディング..! :)

0
SKDroid