我正在开发一款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不要使用更新的附加内容。
我该如何解决这个问题?
答案 0 :(得分:0)
事实证明,Android keeps caching my intents Extras, how to declare a pending intent that keeps fresh extras?的副本等等。
添加FLAG_UPDATE_CURRENT似乎解决了这个问题。