Такие же уведомления повторяются с пользователем после каждого выхода из приложения - PullRequest
1 голос
/ 30 мая 2020

Я использую Сервис в своем приложении для отправки уведомлений пользователю после того, как пользователь выходит из приложения; это работает, но у меня есть одна проблема после того, как пользователь выходит из приложения каждый раз, когда он получает последнее уведомление, полученное каждый раз, когда он входит и выходит, одно и то же уведомление повторяется, даже если нового уведомления нет. Это проблема. Уведомления следует отправлять пользователю только один раз, и если он выйдет в следующий раз, его не следует отправлять снова. Просто если у него есть новое уведомление с новым идентификатором, оно должно быть отправлено пользователю один раз.

Это класс моих услуг

public class MyService extends Service {





    public MyService() {
    }

    @Override
    public void onCreate(){
        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId){
        Toast.makeText(this, "Start myServis", Toast.LENGTH_LONG).show();
    //    run_loop();
        return START_STICKY;
    }




    @Override
    public void onDestroy(){
        Toast.makeText(this, "Stopmyservci", Toast.LENGTH_LONG).show();
       super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}


Я получаю данные по этому коду ..

 public void run_loop(){
        String url =  "http://00000000/testnet/android_register_login/ShowAllData.php";
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray jsonArray = response.getJSONArray("data");
                                JSONObject hit = jsonArray.getJSONObject(0);
                                String id = hit.getString("id");
                                int lastThread = Integer.parseInt(String.valueOf(id));
                                JSONObject jsonObject = null;
                                Toast.makeText(MainActivtiy.this, lastThread + "", Toast.LENGTH_SHORT).show();
                                if (app.getTotal_threads() < lastThread) {
                                    app.setTotal_threads(lastThread);
                                    Notification notification = new NotificationCompat.Builder(MainActivtiy.this)
                                            .setSmallIcon(android.R.drawable.ic_popup_reminder)
                                            .setContentTitle("title")
                                            .setContentText("message")
                                            .setAutoCancel(true)
                                            .setPriority(NotificationCompat.PRIORITY_HIGH)
                                            .setCategory(NotificationCompat.CATEGORY_MESSAGE)
                                            .build();

                                    notificationManager.notify(1, notification);

                            }
                            } catch(JSONException e){
                                e.printStackTrace();
                            }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });


        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(request);


        Handler handler=new Handler();
        handler.postDelayed(new Runnable(){
            @Override
            public void run() {
                run_loop();
            }
        },10000);

    }


public void onBackPressed() {
        Intent sr =new Intent(this, MyService.class);
        startService(sr);
        Toast.makeText(this, "Exit", Toast.LENGTH_SHORT).show();
        finish();
        run_loop();
        super.onBackPressed();
    }


Я храню id здесь

public class App extends Application {
    public static final String CHANNEL_1_ID = "channel1";
    public static final String CHANNEL_2_ID = "channel2";
    private int Total_threads;
    @Override
    public void onCreate() {
        super.onCreate();

        createNotificationChannels();
    }
    public int getTotal_threads() {
        return Total_threads;
    }
    public void setTotal_threads(int Total_threads) {
        this.Total_threads = Total_threads;
    }
    private void createNotificationChannels() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel1 = new NotificationChannel(CHANNEL_1_ID, "Channel 1", NotificationManager.IMPORTANCE_HIGH
            );
            channel1.setDescription("This is Channel 1");

            NotificationChannel channel2 = new NotificationChannel(CHANNEL_2_ID, "Channel 2", NotificationManager.IMPORTANCE_LOW
            );
            channel2.setDescription("This is Channel 2");

            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(channel1);
            manager.createNotificationChannel(channel2);
        }
    }
}

и получаю его отсюда


    private void JSON() {
        String url = "http://00000000/test/Showall.php";

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {

                        try {

                            JSONArray jsonArray = response.getJSONArray("data");

                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject hit = jsonArray.getJSONObject(i);
                                JSONObject jsonObject = null;

                                String id= hit.getString("id");




app.setTotal_threads(Integer.parseInt(String.valueOf(id)));

                            }

Что я могу попробовать дальше?

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Я думаю, это потому, что вы используете Handler для вызова run_loop() внутри своей функции run_loop(). Возможно, он производит al oop, из-за чего вы получаете несколько уведомлений. Попробуйте переместить его за пределы l oop и проверьте, работает ли он.

1 голос
/ 30 мая 2020

На мой взгляд, есть несколько причин для этого:

Во-первых, ваше условие if (app.getTotal_threads() < lastThread) выполняется дважды, потому что значение Total_threads по какой-то причине потеряно, поэтому вам нужно для постоянного хранения, как при использовании общих предпочтений. Вот модификация класса App для этого.

public class App extends Application {
    public static final String CHANNEL_1_ID = "channel1";
    public static final String CHANNEL_2_ID = "channel2";
    public static final String PREFS_NAME = "PREFS_NAME";
    public static final String N_THREADS = "nThreads";

    @Override
    public void onCreate() {
        super.onCreate();

        createNotificationChannels();
    }

    public int getTotal_threads() {
        SharedPreferences prefs = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        return prefs.getInt(N_THREADS, 0);
    }

    public void setTotal_threads(int Total_threads) {
        SharedPreferences prefs = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putInt(N_THREADS, Total_threads);
        editor.apply();
    }

    private void createNotificationChannels() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel1 = new NotificationChannel(CHANNEL_1_ID, "Channel 1", NotificationManager.IMPORTANCE_HIGH
            );
            channel1.setDescription("This is Channel 1");

            NotificationChannel channel2 = new NotificationChannel(CHANNEL_2_ID, "Channel 2", NotificationManager.IMPORTANCE_LOW
            );
            channel2.setDescription("This is Channel 2");

            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(channel1);
            manager.createNotificationChannel(channel2);
        }
    }
}

Другая возможная причина заключается в том, что сервер может отправить такое же уведомление с другим номером потока .. в этом случае вам нужно исправить задний конец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...