多次重复广播从未获得新的额外内容

时间:2012-05-11 00:37:03

标签: java android broadcastreceiver alarmmanager android-pendingintent

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

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&#34 ;,则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);
}

2 个答案:

答案 0 :(得分:0)

该行:

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

不会更改附加内容 - 请参阅here。此外,您依靠requestCode来区分未记录的PendingIntent - 请参阅here。你有没有成功?

答案 1 :(得分:-1)

尝试使用:

intent.putExtra("message", message);

然后

message = intent.getStringExtra("message");

而不是Bundle