اذهب إلى المحتوى

السؤال

نشر

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

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

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

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

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

 

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

    }

 

Recommended Posts

  • 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(); هنا ؟

  • 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
  • 0
نشر

@Mohamd Imran

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

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...