0
如何在遠程數據庫的每個更新中向用戶發送通知。我想通知用戶,如果有任何新行添加或更新現有的行。我正在使用自定義ListView並想顯示BigPictureStyle通知。在Android上獲取MYSQL更新通知
public class EventServices extends Service {
int numMessages = 0;
String rowCount = null;
int oldRowCount = 0;
HashMap<String,String> hashMap = new HashMap<>();
String rowCountLink = "http://192.168.0.101/getdbrowcount.php";
public EventServices() {
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
Toast.makeText(this, "Service was Created", Toast.LENGTH_LONG).show();
oldRowCount = Integer.parseInt(getRowCount());
}
@Override
public void onStart(Intent intent, int startId) {
Log.d("Parse","Old row count: "+ oldRowCount);
Log.d("Parse","New row count: "+Integer.parseInt(getRowCount()));
if(Integer.parseInt(getRowCount())> oldRowCount) {
String newEventLink = "http://192.168.0.101/getnewevent.php";
new MyTask(newEventLink).execute();
// NewEventDetails newED = new NewEventDetails();
// NewEventHashMap newEventHashMap = new NewEventHashMap();
String name = hashMap.get("name");
String description = hashMap.get("description");
String image = hashMap.get("image");
Log.d("Parse","New event name: "+name);
Log.d("Parse","New event description: "+description);
Log.d("Parse","New event image: "+image);
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
Intent resultIntent = new Intent(this, ItemDetailActivity.class);
resultIntent.putExtra("description",description);
PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0,
resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mNotifyBuilder;
NotificationManager mNotificationManager;
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Sets an ID for the notification, so it can be updated
int notifyID = 9001;
mNotifyBuilder = new NotificationCompat.Builder(this)
.setContentTitle(name)
.setContentText(description)
.setSmallIcon(R.drawable.icon);
// Set pending intent
// startActivity(resultIntent);
// mNotifyBuilder.setContentIntent()
mNotifyBuilder.setContentIntent(resultPendingIntent);
// Set Vibrate, Sound and Light
int defaults = 0;
defaults = defaults | Notification.DEFAULT_LIGHTS;
defaults = defaults | Notification.DEFAULT_VIBRATE;
defaults = defaults | Notification.DEFAULT_SOUND;
mNotifyBuilder.setDefaults(defaults);
// Set the content for Notification
// mNotifyBuilder.setContentText(intent.getStringExtra("intntdata"));
// Set autocancel
mNotifyBuilder.setAutoCancel(true);
// Post a notification
mNotificationManager.notify(notifyID, mNotifyBuilder.build());
oldRowCount++;
}else{
}
}
@Override
public void onDestroy() {
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
private String getRowCount(){
RowCountDownloader rowCountDownloader = new RowCountDownloader(rowCountLink);
try {
rowCount = rowCountDownloader.execute().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
// Log.d("Parse","Rowcount in services: "+rowCount);
return rowCount;
}
class MyTask extends AsyncTask<Void,Integer,String> {
String newEventLink;
// HashMap<String,String> hashMap = new HashMap<>();
public MyTask(String newEventLink){
this.newEventLink = newEventLink;
}
@Override
protected String doInBackground(Void... params) {
String data = downloadData();
return data;
}
@Override
protected void onProgressUpdate(Integer... values) {
}
private String downloadData() {
String line = null;
InputStream inputStream =null;
try{
URL url = new URL(newEventLink);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
inputStream = new BufferedInputStream(con.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer sb = new StringBuffer();
if (br != null) {
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
} else {
return null;
}
try{
JSONObject jo = new JSONObject(sb.toString());
JSONArray ja = jo.getJSONArray("result");
JSONObject obj = ja.getJSONObject(0);
hashMap.put("name",obj.getString("name"));
hashMap.put("description",obj.getString("description"));
hashMap.put("image",obj.getString("image"));
}catch (JSONException e){
e.printStackTrace();
}
return null;
}catch(MalformedURLException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}finally {
if(inputStream!=null){
try{
inputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return null;
}
}
}
每當創建一個新的服務它取(從表COUNT(*))排的總數,然後在變量存儲,然後從PHP腳本更新行數下一次維修檢查,然後進行比較與現有的行數。 如果新行數大於現有數,那麼它將從數據庫中提取數據(SELECT * from table where id =(SELECT COUNT(*)FROM table))。它將僅返回新行,然後顯示通知。
但我的問題是它顯示來自遠程數據庫的新數據之前的通知。可能是因爲我正在從服務器上下載圖片。那麼,如何解決這個問題呢?