• 0

مشكلة تكرار اخر اشعار من قاعدة البيانات للمستخدم

السلام عليكم ورحمة الله وبركاته

تحيه طيبه للجميع

لدي استفسار لو تكرمتو

اعمل على كود ارسال الاشعارات من التطبيق الى المستخدم الكود شغال ميه ميه ولكن توجد مشكله بسيطه في الامر 

الكود يشتغل بعد من يقوم المستخدم بالخروج من التطبيق من خلال ..

 

    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();
    }

المشكله انه كل ما خرج من التطبيق يشاهد اخر اشعار وصله من جديد او السيرفر يرجع يرسل له اشعار هو سبق وتم ارساله للمستخدم يعني السيرفر يعمل تكرار .. المفترض المستخدم من يوصله  الاشعار لمره واحده لا  يوصله من جديد لنفس الاشعار كيف يمكن حل هذا المشكله لو تكرمتو بحيث انه الاشعار الجديد يصل للمستخدم لمره واحده فقط وليس كل ما دخل التطبيق وخرج يحصل على اشعار باخر رسالة وصلته او اخر موضوع ..

كود السيرفر ..

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);

    }

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 1

وعليكم السلام أخي @مروان مروان3

 

يبدو أن سبب المشكلة هو عند ضغط زر الرجوع يتم تشغيل السيرفيس مرة أخرى لحل المشكلة نقوم أولا بالتأكد من أن السيرفيس الخاصة بنا تعمل مسبقاً أم لا  في الخلفية وبناء على ذلك نقوم بتشغيلها عند الضغط على زر الرجوع  قمت بعمل ميثود تقوم بإرجاع true أو false لحالة السيرفيس ضعها تحت ال onCreate ميثود 

private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

ونقوم بإستخدامها هكذا في الكود الخاص بك 

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

 وأيضا هنا لديك خطأ تستدعي ال فنكشن run_loop مرتين حيث يتم تشغيل التايمر أو اللوب عند تشغيل السيرفيس أي لا يوجد داعي لإضافتها مرة أخرى في ال onBackPressed وعدل هذا الجزء من السيرفيس لكي يشغل الفنكشن الخاص بك

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

وقم بإزالتها من onBackPressed أي هكذا 

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

        super.onBackPressed();
    }

وأيضا لماذا تستخدم  finish(); هنا ؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

اهلا اخي @Mohamd Imran

الان اصبح شكل الكلاس سيرفس لدي كالتالي 

public class MyService extends Service {
    public NotificationManagerCompat notificationManager;
    String id;
    App app;
    public MyService() {
    }

    @Override
    public void onCreate(){
        app = (App) getApplicationContext();
        id= String.valueOf(app.getTotal_threads());
        Log.i(TAG,"test"+ id.toString());
        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;
    }

    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(MyService.this, lastThread + "", Toast.LENGTH_SHORT).show();
                            if (app.getTotal_threads() < lastThread) {
                                app.setTotal_threads(lastThread);
                                Notification notification = new NotificationCompat.Builder(MyService.this, CHANNEL_1_ID)
                                        .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);

    }



    @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");
    }
}

وصفحة    home  كالتالي 

 

public class Home extends AppCompatActivity {
    
   
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
    }





    private boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }

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

        super.onBackPressed();
    }

    

}

 

 

 

 

تمّ تعديل بواسطة مروان مروان3
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0
بتاريخ 17 دقائق مضت قال مروان مروان3:

الان اصبح شكل الكلاس سيرفس لدي كالتالي 



 

تمام إختبر النتيجة وأخبرني إن يوجد مشكلة :)

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

@Mohamd Imran

والله ي خوي ان راسي دار اعذرني ازعجتك بس الموضوع يلف براس شوية 

من الواضح ان الكود الذي قمت بتعديله صار شغال ربي يعطيك الف عافيه اذا شفت فيه اي شي ما شغال عدل رح ابلغك باذن الله كل الشكر لك عزيزي ربي يزيدك من واسع فضله

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن