在 Android 上获得 MYSQL 更新通知

Get MYSQL update notification on Android

如何在远程数据库中的每次更新时向用户发送通知。如果添加了任何新行或更新了现有行,我想通知用户。我正在使用自定义 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;
      }
    }





  }

每当创建新服务时,它都会获取总行数(table 中的 COUNT(*)),然后存储在变量中,然后下次服务从 [=19= 中检查更新的行数] 脚本,然后将其与现有的行数进行比较。 如果新行数大于现有行数,那么它将从数据库中获取数据 (SELECT * from table where id = (SELECT COUNT(*) FROM table) ).它只会 return 新行然后显示通知。

但我的问题是它在来自远程数据库的新数据之前显示通知。可能是因为我正在从服务器下载图像。那么,如何解决这个问题?

所以,经过大量研究,我已经解决了这个问题。我将所有用于下载数据的代码放在 doInBackground() 中,然后将结果传递到我在 Notification 上显示的 onPostExecute 中。