2014-09-19 137 views
1

我正在构建一个应用程序,我需要将字符串传递给BroadcastReceiver,每次不同)。然而,它总是发送我第一次发送的字符串。任何人都可以提出解决方案在此先感谢从活动发送字符串到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 2014-09-19 08:09:35

+1

你在'getActivity()'的PendingIntent,而不是在'getBroadcast()'的PendingIntent做到了,这是造成重复数据的原因之一。看看你设置闹钟的部分。 – 2014-09-19 08:13:29

+1

非常感谢你,伙计,现在它工作:) – kg2152 2014-09-19 08:23:06

相关问题