如何在远程数据库的每次更新时向用户发送通知。我想通知用户,如果有任何新的行添加或更新现有的一个。我正在使用自定义ListView并想要显示BigPictureStyle通知。
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)))。它将只返回新行,然后显示通知。
但我的问题是它显示通知之前,它从远程数据库的新数据。可能是因为我正在从服务器下载图像。那么,如何解决这个问题呢?
所以,经过大量的研究,我解决了这个问题。我把所有的代码下载的数据在doInBackground(),然后在onPostExecute传递的结果,我已经显示在通知。