我放入额外内容的字符串不是我输出的字符串

时间:2012-05-28 20:09:49

标签: java android android-intent android-activity

我正在开发一款Android应用,其中用户可以向其他用户发送“推介”。在启动时,我运行以下方法,该方法查询远程数据库并检查新的引用:

@Override
protected void onHandleIntent(Intent intent) {
    Bundle extras = intent.getExtras();
    String username = extras.getString(WeShouldActivity.ACCOUNT_NAME);

    HttpClient httpclient = new DefaultHttpClient();

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("user_email", username));

    String paramString = URLEncodedUtils.format(nameValuePairs, "utf-8");

    HttpGet httpget = new HttpGet("http://23.23.237.174/check-referrals?"+paramString);

    JSONObject resp = new JSONObject();
    JSONArray data = new JSONArray();

    try {

        HttpResponse response = httpclient.execute(httpget);

        InputStream is = response.getEntity().getContent();


        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        int i=0;
        while(i != -1){
            i = is.read();
            baos.write(i);
        }



        byte[] buf = baos.toByteArray(); 
        //is.read(buf);

        Log.v("REFERRAL RESPONSE", new String(buf));

        resp = new JSONObject(new String(buf));

        data = resp.getJSONArray("referrals"); 


        Log.v("GETREFERRALSSERVICE", "Checking for new referrals");


    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        Log.v("GETREFERRALSSERVICE", e.getMessage());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        Log.v("GETREFERRALSSERVICE", e.getMessage());
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Log.v("GET REFFERAL SERVICE", "JSON EXCEPTION "+e.getMessage());
    }

    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager nm = (NotificationManager) getSystemService(ns);

    int icon = R.drawable.restaurant;
    String tickerText = "New referrals!";
    long when = System.currentTimeMillis();
    Notification notification = new Notification(icon, tickerText, when);

    Context context = getApplicationContext();
    CharSequence contentTitle = "New referrals!";

    Log.v("REFERRAL DATA", data.toString());

    if(data.length() >0){
        CharSequence contentText = "You have "+data.length()+" new referrals awaiting your approval.";
        Intent notificationIntent = new Intent(this, ApproveReferral.class);
        notificationIntent.putExtra("we.should.communication.data", data.toString());
        //Log.v("AFTER EXTRAS INSERT", notificationIntent.getStringExtra("data"));
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
        notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL;
        nm.notify(ActivityKey.NEW_REFERRAL.ordinal(), notification);
    } 
}

因此,如果远程数据库上有任何引用,则会弹出通知。单击通知会触发ApproveReferral活动,如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {

    final Context c = this.getApplicationContext(); //I don't know if this is the right way to do this!
    super.onCreate(savedInstanceState);
    setContentView(R.layout.approve_referral);
    ListView lv = (ListView) findViewById(R.id.referralList);
    final List<Referral> list = new ArrayList<Referral>();
    Intent intent = this.getIntent();
    Bundle bundle = intent.getExtras();
    String dataAsString = bundle.getString("we.should.communication.data");
    Log.v("DATA EXTRA", dataAsString);
    JSONArray data = new JSONArray();
    //get referral items from extras
    try {
        data = new JSONArray(dataAsString);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    for(int i=0; i<data.length(); i++){
        try {
            JSONObject o = data.getJSONObject(i);
            Log.v("REFFERAL OBJECT DATA", o.toString());

            JSONObject d = new JSONObject(o.getString("data"));

            list.add(new Referral(o.getString("item_name"), o.getString("referred_by"), false, d));
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.v("REFERRAL OBJECT DATA", e.getMessage());
        }

    }
    Log.v("REFERRAL LIST", list.toString());
    mAdapter = new ReferralAdapter(this, list);
    lv.setAdapter(mAdapter);

    mSave = (Button) findViewById(R.id.save);
    mSave.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            List<Referral> approvedList = mAdapter.getApprovedList();

            //TODO: send approved/rejected to remote db and delete

            Referrals refs = Referrals.getReferralCategory(c);

            for(Referral r: approvedList){
                ReferralItem ref = refs.newItem(r.getData());

                try{
                    ref.save();
                } catch(Exception e) {
                    Toast.makeText(c, e.getMessage(), Toast.LENGTH_SHORT).show();
                    return;
                }


            }

            deleteRefs(list);

            finish();
        }

    });
}

我遇到了一个问题,我会给自己发送一个推荐(这是允许的,所以不是那个),或者其他人会给我一个推荐,我会收到一个通知,例如“你有3个新的推荐“,但是当我打开批准推荐视图时,我只会得到2。

我已经追溯到这样一个事实:我在ApproveReferral的附加内容中放入的“数据”字符串不是出现的字符串。

E.g。

Log.v("REFERRAL DATA", data.toString());
notificationIntent.putExtra("we.should.communication.data", data.toString());

和data.toString()看起来像:

05-28 12:53:10.874: V/REFERRAL DATA(13610): [{"data":"{\"website:0:1\":\"http:\\\/\\\/m.imdb.com\\\/title\\\/tt0848228\",\"name:0:0\":\"The Avengers\",\"comment:1:5\":\"2012\",\"rating:3:4\":\"5.0\",\"tags:1:6\":\"[{\\\"id\\\":2,\\\"color\\\":\\\"Red\\\",\\\"tag\\\":\\\"again\\\"}]\"}","item_name":"The Avengers","referred_by":"troyschuring@gmail.com"},{"data":"{\"website:0:1\":\"http:\\\/\\\/www.edgewaterhotel.com\\\/edgewater_dining.aspx\",\"name:0:0\":\"Six Seven\",\"comment:1:5\":\"\",\"phone number:2:2\":\"(206) 269-4575\",\"rating:3:4\":\"\",\"tags:1:6\":\"[]\",\"address:1:3\":\"{\\\"long\\\":-122.352644,\\\"address\\\":\\\"2411 Alaskan Way, Seattle, WA, United States\\\",\\\"lat\\\":47.612579}\"}","item_name":"Six Seven","referred_by":"cc.emeraldeyes@gmail.com"},{"data":"{\"website:0:1\":\"http:\\\/\\\/www.paseoseattle.com\\\/\",\"name:0:0\":\"Paseo\",\"comment:1:5\":\"\",\"phone number:2:2\":\"(206) 545-7440\",\"rating:3:4\":\"5.0\",\"tags:1:6\":\"[{\\\"id\\\":1,\\\"color\\\":\\\"Purple\\\",\\\"tag\\\":\\\"Colin\\\"}]\",\"address:1:3\":\"{\\\"long\\\":-122.3501502,\\\"address\\\":\\\"4225 Fremont Avenue North, Seattle, WA, United States\\\",\\\"lat\\\":47.6586176}\"}","item_name":"Paseo","referred_by":"cc.emeraldeyes@gmail.com"}]

看,有3个项目!

然后在approveReferral的开头:

05-28 12:53:13.877: V/DATA EXTRA(13610): [{"data":"{\"website:0:1\":\"http:\\\/\\\/m.imdb.com\\\/title\\\/tt0848228\",\"name:0:0\":\"The Avengers\",\"comment:1:5\":\"2012\",\"rating:3:4\":\"5.0\",\"tags:1:6\":\"[{\\\"id\\\":2,\\\"color\\\":\\\"Red\\\",\\\"tag\\\":\\\"again\\\"}]\"}","item_name":"The Avengers","referred_by":"troyschuring@gmail.com"},{"data":"{\"website:0:1\":\"http:\\\/\\\/www.edgewaterhotel.com\\\/edgewater_dining.aspx\",\"name:0:0\":\"Six Seven\",\"comment:1:5\":\"\",\"phone number:2:2\":\"(206) 269-4575\",\"rating:3:4\":\"\",\"tags:1:6\":\"[]\",\"address:1:3\":\"{\\\"long\\\":-122.352644,\\\"address\\\":\\\"2411 Alaskan Way, Seattle, WA, United States\\\",\\\"lat\\\":47.612579}\"}","item_name":"Six Seven","referred_by":"cc.emeraldeyes@gmail.com"}]

现在只有2个。

我唯一可以想到的是,由于某种原因,approveReferral是“缓存”(我把它放在引号中因为我不熟悉android并且不确定这个术语的适用性)它的附加内容和isn不要使用更新的附加内容。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

事实证明,Android keeps caching my intents Extras, how to declare a pending intent that keeps fresh extras?的副本等等。

添加FLAG_UPDATE_CURRENT似乎解决了这个问题。