2

我有一个应用程序可以在给定时间或设定的时间间隔安排推文。我使用重复的广播意图来发送推文。我包括消息、用户名等的附加内容。我使用用户名+消息的 md5sum 作为唯一标识符,以便每个意图都是唯一的。该代码适用于一条推文,但当我添加另一条推文时,新推文包含与第一条相同的附加内容。

private void setupTimedTweet(int position, Context c, String username,
                String message, String day, String mentions, String timeValue){
    Bundle b = new Bundle();
    b.putString("username", username);
    Toast.makeText(c, "New tweet saved, "+ message, Toast.LENGTH_LONG).show();
    b.putString("message", message);
    b.putString("mentions", mentions);
    b.putString("day", day);
    Intent myIntent = new Intent(c, TweezeeReceiver.class);
    myIntent.putExtras(b);
    PendingIntent pendingIntent =
              PendingIntent.getBroadcast(c, md5(username+message), myIntent, 0);
    AlarmManager alarmManager =
                        (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.setTimeZone(TimeZone.getDefault());
    calendar.set(Calendar.HOUR_OF_DAY,Integer.parseInt(timeValue.split(":")[0]));
    calendar.set(Calendar.MINUTE, Integer.parseInt(timeValue.split(":")[1]));
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
            calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent;
}

该方法中的吐司具有正确的信息。设置新警报时,没有问题。然而,接收者永远不会获得新推文的更新附加内容。如果我安排了一条推文“test1”,然后是另一个推文“test2”,则 setupIntervalTweet() 方法具有正确的信息,但是当接收者收到它时,它具有来自“test1”推文的相同信息。

@Override
public void onReceive(Context c, Intent i) {
    Log.d("RECERIVER", "TWEET RECIEVED!");
    Bundle tweetInfo = i.getExtras();
    message = tweetInfo.getString("message");
    username = tweetInfo.getString("username");
    day = tweetInfo.getString("day");
    prefs = PreferenceManager.getDefaultSharedPreferences(c);
    ctx = c;
    mHandler = new Handler();
    sendTweet();
}

为什么我的接收器没有得到正确的附加功能?

完整的源代码可以在这里找到。https://github.com/T3hh4xx0r/TweeZee/

编辑:我已经可以更新推文了,但是我无法让新的附加功能在新推文上工作以保存新的附加功能。我正在使用FLAG_UPDATE_CURRENT更新我的待处理意图。我听说要使用,FLAG_CANCEL_CURRENT开始新的,但我不想取消一个,我只想开始一个新的。我找不到新的或类似的标志。

这是更新的代码。

private void setupIntervalTweet(int position, Context c, String username,
                                String message, String wait, String day,
                                String mentions, boolean updating, String og) {
    Bundle b = new Bundle();
    b.putString("username", username);
    b.putString("message", message);
    b.putString("mentions", mentions);
    b.putString("day", day);
    Toast.makeText(c, "New tweet saved, "+message, Toast.LENGTH_LONG).show();
    Intent myIntent = new Intent(c, TweezeeReceiver.class);
    myIntent.putExtras(b);
    PendingIntent pendingIntent;
    if (updating) {
        pendingIntent = PendingIntent.getBroadcast(c, md5(username+og), myIntent,
                                PendingIntent.FLAG_UPDATE_CURRENT);
    } else {
        pendingIntent = PendingIntent.getBroadcast(c, md5(username+message),
                                                                    myIntent, 0);
    }
    AlarmManager alarmManager =
                        (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                                    Integer.parseInt(wait)*60000, pendingIntent);
}
4

2 回答 2

0

该行:

pendingIntent = PendingIntent.getBroadcast(c, md5(username+message), myIntent, 0);

不会改变额外的东西 - 见这里。此外,您还依靠srequestCode来区分PendingIntent未记录的 s - 请参见此处。你让它工作了吗?

于 2013-03-18T01:35:32.267 回答
-1

Try using:

intent.putExtra("message", message);

and then

message = intent.getStringExtra("message");

instead of the Bundle.

于 2012-05-11T02:09:50.247 回答