[Android] الروبوت كيف يمكنني الانتظار حتى يتم توصيل خدمة فعلا؟


Answers

كان لي نفس المشكلة. لم أكن أريد أن أضع رمز الخدمة المعتمد الخاص بي في onServiceConnected ، على الرغم من ذلك، لأنني أردت ربط / onStart مع onStart و onStop, ولكن لم أكن أريد رمز لتشغيل مرة أخرى في كل مرة عاد النشاط إلى الأمام. أردت فقط أن تعمل عندما تم إنشاء النشاط لأول مرة.

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

Question

لدي نشاط يدعو خدمة معرفة في IDownloaderService.aidl:

public class Downloader extends Activity {
 IDownloaderService downloader = null;
// ...

في Downloader.onCreate (حزمة) حاولت ربط بينسرفيس

Intent serviceIntent = new Intent(this, DownloaderService.class);
if (bindService(serviceIntent, sc, BIND_AUTO_CREATE)) {
  // ...

وضمن كائن سيرفيسكونكتيون سك فعلت هذا

public void onServiceConnected(ComponentName name, IBinder service) {
  Log.w("XXX", "onServiceConnected");
  downloader = IDownloaderService.Stub.asInterface(service);
  // ...

عن طريق إضافة جميع أنواع Log.xx وجدت أن التعليمات البرمجية بعد إذا (بيندسرفيس (...)) يذهب فعلا قبل ServiceConnection.onServiceConnected يتم استدعاء - وهذا هو، عندما تحميل لا يزال نول - الذي يحصل لي في ورطة. جميع العينات في أبيديموس تجنب هذه المشكلة توقيت فقط من خلال استدعاء الخدمات عند تشغيلها من قبل إجراءات المستخدم. ولكن ماذا علي أن أفعل لاستخدام هذه الخدمة بعد نجاح بيندسرفيس الحق؟ كيف يمكنني الانتظار ل ServiceConnection.onServiceConnected يجري استدعاؤها بشكل موثوق؟

سؤال آخر ذات صلة. هل كافة معالجات الحدث: أكتيفيتي. إنشاء، أي View.onClickListener.onClick، ServiceConnection.onServiceConnected، وما يسمى فعلا في نفس الموضوع (المذكورة في المستند باسم "مؤشر الترابط الرئيسي")؟ هل هناك اشتباكات بينهما، أو الروبوت جدولة جميع الأحداث تأتي حيز الوجود التعامل معها واحدا تلو الآخر؟ أو، عندما بالضبط هو ServiceConnection.onServiceConnected فعلا الذهاب إلى أن يسمى؟ عند الانتهاء من Activity.onCreate أو في وقت ما لا يزال A.oC قيد التشغيل؟




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

للوصول إلى البيانات والأساليب في نفس العملية (أو التطبيق)، انتهى بي الأمر تنفيذ الطبقات سينغلتون. إذا كانت الطبقات تحتاج إلى سياق لبعض الطرق، أنا تسرب سياق التطبيق إلى الطبقات سينغلتون. هناك، بطبيعة الحال، نتيجة سيئة منه لأنه يكسر "المدى الفوري". ولكن هذا هو حل وسط أفضل عموما، على ما أعتقد.




فعلت شيئا مماثلا من قبل، ومختلف الوحيد هو أنني لم تكن ملزمة للخدمة، ولكن مجرد بدء تشغيله.

وأود أن بث نية من الخدمة لإعلام المتصل / النشاط حول بدء تشغيله.