2014-09-19 2 views
1

Я создаю приложение, где мне нужно передать строку в BroadcastReceiver (каждый раз, когда разные). Однако он всегда отправляет строку, которую я отправил в первый раз. Может ли кто-нибудь предложить какое-либо решение? Заранее спасибоОтправить строку из Activity to BroadcastReceiver

Вот мой код

public class MainActivity extends Activity implements View.OnClickListener{ 

private PendingIntent pendingIntent; 
private EditText event; 
private Button submit, date, time; 
private static final int DIALOG_DATE = 1; 
private static final int DIALOG_TIME = 2; 

private int myYear = 2014; 
private int myMonth = 8; 
private int myDay = 16; 
private int myHour = 6; 
private int myMinute = 30; 

private List<String> events; 
private List<Calendar> dateTimes; 


@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    event = (EditText)findViewById(R.id.event); 
    submit = (Button)findViewById(R.id.submit); 
    submit.setOnClickListener(this); 
    date = (Button)findViewById(R.id.date); 
    date.setOnClickListener(this); 
    time = (Button)findViewById(R.id.time); 
    time.setOnClickListener(this); 

    events = new ArrayList<String>(); 
    dateTimes = new ArrayList<Calendar>(); 

    //List<Calendar> events = new ArrayList<Calendar>(); 

} 

@Override 
protected Dialog onCreateDialog(int id) { 
    if(id == DIALOG_DATE) { 
     DatePickerDialog datePickerDialog = new DatePickerDialog(this, myCallBack, myYear, myMonth, myDay); 
     return datePickerDialog; 
    }else { 
     TimePickerDialog timePickerDialog = new TimePickerDialog(this, myCallBack1, myHour, myMinute, true); 
     return timePickerDialog; 
    } 
} 

DatePickerDialog.OnDateSetListener myCallBack = new DatePickerDialog.OnDateSetListener() { 
    @Override 
    public void onDateSet(DatePicker datePicker, int year, int month, int day) { 
     myYear = year; 
     myMonth = month; 
     myDay = day; 
    } 
}; 
TimePickerDialog.OnTimeSetListener myCallBack1 = new TimePickerDialog.OnTimeSetListener() { 
    @Override 
    public void onTimeSet(TimePicker timePicker, int hour, int minute) { 
     myHour = hour; 
     myMinute = minute; 
    } 
}; 

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.date: 
      showDialog(DIALOG_DATE); 
      break; 
     case R.id.time: 
      showDialog(DIALOG_TIME); 
      break; 
     case R.id.submit: 
      String eventS = event.getText().toString(); 

      Calendar calendar = Calendar.getInstance(); 

      calendar.set(Calendar.MONTH, myMonth); 
      calendar.set(Calendar.YEAR, myYear); 
      calendar.set(Calendar.DAY_OF_MONTH, myDay); 

      calendar.set(Calendar.HOUR_OF_DAY, myHour); 
      calendar.set(Calendar.MINUTE, myMinute); 
      calendar.set(Calendar.SECOND, 0); 

// calendar.set (Calendar.AM_PM, Calendar.PM);

  Intent myIntent = new Intent(MainActivity.this, BR.class); 
      Bundle bundle = new Bundle(); 
      bundle.putString("event", eventS); 
      myIntent.putExtras(bundle); 
      pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, 0); 

      AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
      alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent); 
      event.setText(""); 
      break; 

    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

} 

}

public class BR extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    Intent myIntent = new Intent(context, MyService.class); 
    String event = intent.getStringExtra("event"); 
    Bundle bundle = new Bundle(); 
    bundle.putString("event", event); 
    myIntent.putExtras(bundle); 

    context.startService(myIntent); 
    Log.i("myLogs", "BR started"); 

} 

}

public class MyService extends Service { 

private NotificationManager mManager; 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
} 

@SuppressWarnings("static-access") 
@Override 
public void onStart(Intent intent, int startId) { 

    super.onStart(intent, startId); 

    mManager = (NotificationManager) this.getApplicationContext().getSystemService(this.getApplicationContext().NOTIFICATION_SERVICE); 
    Intent intent1 = new Intent(this.getApplicationContext(),MainActivity.class); 
    String event = intent.getStringExtra("event"); 

    Notification notification = new Notification(R.drawable.ic_launcher, "This is a test message!", System.currentTimeMillis()); 
    intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    PendingIntent pendingNotificationIntent = PendingIntent.getActivity(this.getApplicationContext(),0, intent1,PendingIntent.FLAG_UPDATE_CURRENT); 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    notification.setLatestEventInfo(this.getApplicationContext(), event, event, pendingNotificationIntent); 

    mManager.notify(0, notification); 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

}

ответ

1

PendingIntent маркеры могут быть и повторно использованы, если не указано иное, или выдается с уникальными кодами запроса. Если вам не нужно обрабатывать несколько уникальных PendingIntents, вы можете просто передать флаг, чтобы обновить текущий токен с новыми данными Intent.

pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
+0

Я думаю, что это не проблема, кстати, у меня уже есть в моем коде выше – kg2152

+1

Вы сделали это в 'getActivity()' PendingIntent, а не в 'getBroadcast()' PendingIntent, который является причиной повторных данных. Посмотрите раздел, в котором вы настраиваете будильник. –

+1

Большое вам спасибо, приятель, теперь это работает :) – kg2152

Смежные вопросы