سؤال

سأكون ممتنًا للحصول على بعض الإرشادات حول كيفية التعامل مع نظام التشغيل الذي يقتل خدمة طويلة المدى.

سيناريو العمل:

يسجل التطبيق مسار BTT والذي قد يستمر لعدة ساعات.ويمكنه أيضًا إظهار المسار على الخريطة مع الإحصائيات ذات الصلة.

تتيح واجهة مستخدم التطبيق للمستخدم بدء/إيقاف تسجيل المسار وعرض المسار في الوقت الفعلي على الخريطة.

بعد بدء تسجيل المسار، يمكن للمستخدم الخروج من التطبيق وإيقاف تشغيل الشاشة (لتوفير الطاقة)، ​​وستبقى خدمة فقط قيد التشغيل للحفاظ على تحديث التسجيل لقاعدة البيانات (يظهر الإشعار)، حتى يبدأ المستخدم النشاط مرة أخرى ويطلب إيقاف التسجيل مما يؤدي إلى إنهاء الخدمة.

مشكلة:

وبعد فترة زمنية متغيرة تتراوح من 40 دقيقة إلى ساعة ونصف، يتم إيقاف خدمة التسجيل دون أي إنذار.نظرًا لأن نزهات BTT قد تستغرق عدة ساعات، فإن هذا يؤدي إلى عدم اكتمال تسجيل المسار.

بعض المعلومات الإضافية:

بدأت الخدمة ب START_STICKY ويكتسب أ PARTIAL_WAKE_LOCK, ، ويتم تشغيله في نفس العملية مثل النشاط الرئيسي.

يتم الحصول على المواقع الجديدة (وتسجيلها) بمعدل يحدده المستخدم من ثانية واحدة إلى عدة دقائق.أعلم من وثائق Android أن هذا هو سلوك نظام التشغيل المتوقع للخدمات طويلة المدى.

سؤال:

ما هو أفضل نهج للتصميم المعماري للحصول على تطبيق جيد الأداء يمكنه تلبية متطلبات سيناريو العمل؟

يمكنني التفكير في خيارين (وأنا لا أحب أيًا منهما)، لكني أرغب في الحصول على إرشادات من شخص سبق أن واجه مشكلة مماثلة وحلها:

  • Use broadcast receiver (ideally connected to Location Manager if that’s possible) to have the service only running when a new location is acquired?
  • لا تمكن المستخدم من مغادرة النشاط الرئيسي (مما يؤدي إلى صب تجربة المستخدم)؟
  • هل يقوم جهاز استقبال بث التنبيه بإعادة تشغيل الخدمة إذا لزم الأمر؟

شكرا لجميع الذين يمكن أن حصة بعض الحكمة حول هذا الموضوع.

هل كانت مفيدة؟

المحلول

لدي تطبيق يفعل شيئًا مشابهًا جدًا.أتأكد من استمرار تشغيل الخدمة من خلال جعلها مهمة مقدمة.عندما أكون مستعدًا لبدء التشغيل، أقوم باستدعاء هذه الوظيفة، والتي تقوم أيضًا بإعداد إشعار:

void fg() {
    Notification notification = new Notification(R.drawable.logstatus, 
                    "Logging On", System.currentTimeMillis());
    Intent notificationIntent = new Intent(this, LoggerActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
                    notificationIntent, 0);
    notification.setLatestEventInfo(this, "Logger","Logger Running",
                pendingIntent);
    startForeground(1, notification);   
}

ثم ترك الوضع الأمامي عند انتهاء التسجيل:

stopForeground(true);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top