Android - كيفية تحديث القطعة في كثير من الأحيان ولكن فقط عندما يكون مرئيا؟

StackOverflow https://stackoverflow.com/questions/2416782

سؤال

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

ومع ذلك، ليست هناك حاجة لتحديث القطعة إذا كانت غير مرئية حاليا، مما يعني:

  • يتم إيقاف تشغيل الشاشة
  • تطبيق آخر قيد التشغيل
  • يتم وضع القطعة على علامة تبويب الشاشة الرئيسية (غير مرئية)

ما هي أفضل طريقة لتحديث القطعة المرئية فقط كل دقيقة - دون الاستيقاظ الجهاز أو القيام بحسابات غير ضرورية؟ بعد أن تصبح القطعة مرئية، تأخر صغير قبل التحديث مقبول.

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

المحلول

للحفاظ على من التحديث عندما تكون الشاشة خارج، استخدم إنذار لجدولة إنذار متكرر لا يستيقظ الهاتف.

لا يمكن الوصول إلى نقاط الرصاصة الأخرى في سؤالك. لا توجد وسيلة للكشف عن أن القطعة الخاصة بك موجودة على شاشة منزلية غير مرئية حاليا، ولا توجد وسيلة لتحديد ما إذا كان التطبيق يعمل يخفي الشاشة الرئيسية. لقد قدمت تذكرة http://b.android.com. تطلب إضافة هذه الوظيفة إلى Android. إذا كنت تشعر بالبطولة، فستساعدها في الحصول على الأولوية: http://code.google.com/p/android/issues/detail؟id=5529&q=reporter:r.baird&colspec=id٪20Type٪20status٪20owner٪20summary٪20stars.

نصائح أخرى

  1. يمكنك أن تسأل Powermanager عن ISSCREENON ()
  2. يمكنك التسجيل للحصول على Action_Screen_Off / Action_Screen_ON وإيقاف تشغيله وفقا لذلك.

Allthough الجواب أعلاه فيما يتعلق بالإنذار هو الصحيح قد لا يكون كافيا لأنني لاحظت العديد من الهواتف أيضا تقديم أجهزة الإنذار حتى لو لم تكن من النوع * _Wakeup. قد يحدث هذا إذا كانت هناك تطبيقات أخرى مثبتة والتي تستيقظ الجهاز. وإذا كان مستيقظا مرة واحدة، فإنه يوفر جميع أجهزة الإنذار المعلقة.

لقد وجدت هذا تحت مشروع اسمه 24Clock في كود Goole. وبعد حاول عدم تحديث القطعة أثناء وجود المستخدم بعيدا عن المنزل:

    ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

    List<RunningTaskInfo> runningTasks = am.getRunningTasks(2);
    for (RunningTaskInfo t : runningTasks) {
        if (t != null && t.numRunning > 0) {
            ComponentName cn = t.baseActivity;
            if (cn == null) continue;

            String clz = cn.getClassName();
            String pkg = cn.getPackageName();

            // TODO make this configurable
            if (pkg != null && pkg.startsWith("com.android.launcher")) {
                return true;
            }

            return false;
        }
    }

قد تكون إجابة لمتطلباتك رقم 2. على الرغم من أنها قد لا تعمل تحت قاذفات الطرف الثالث الأخرى.

== التحديث ==.

بعد بضعة أشهر، لدي فكرة فجأة في ذهني حول كيفية اكتشاف ما إذا كانت الشاشة المنزلية تظهر. أنا وضعت في بلدي مقالات, وأجرت اختبارا على رغبتي ويعمل بشكل جيد. الطريقة هي الاستعلام عن Android لجميع الحزم المثبتة، والتي تحتوي أحد منها على قدرة "قاذفة"، ثم تحقق مما إذا كان موجودا في أعلى المكدس قيد التشغيل. إذا تم اختبار أي شخص، فيرجى إخبارنا بالنتيجة أيضا، لأنني لا أملك الوصول إلى أجهزة Android الأخرى.

الإجابة المقبولة من MBAird يضرب الظفر على الرأس. المقترحة onVisivilityChange() الطريقة، إذا تم تنفيذها، يجب أن تغطي جميع الحالات أعلاه.

في غضون ذلك، لا تزال هذه مشكلة حقيقية لبعض أنواع القطعة. قدم JOM إمكانية التسجيل لتلقي نوايا Action_screen_off / Action_screen_on. هذا مفيد لأن الاعتماد على إنذار متكرر غير اقتصادي لا يكفي لأن الخدمات الأخرى تجعل أسباب الاستيقاظ. من الصعب لأن مثل هذه الإجراءات لا يمكن الاشتراك بها عبر androidmanifest.xml ولم يسمح ل AppWidgetProvider بالاتصال context.registerReceiver(). وبعد تتم مناقشة هذه القضايا في العديد من أسئلة Stackoverflow الأخرى بما في ذلك الاستماع إلى Action_Screen_off., android.intent.action.screen_on لا يعمل كرشية نية استقبال و Android - كيفية تلقي البث النوى Action_screen_on / OFF؟.

لقد نجحت في الاشتراك في النوايا Action_screen_off / Action_screen_on في عنصر واجهة مستخدم من خلال إنشاء شركة تابعة BroascastReceiver مثيل واستخدام context.getApplicationContext().registerReceiver() لتسجيله. قد يكون هذا جيدا للغش، وعلى الأقل في بعض إصدار Android اللاحق، قد يفشل في مرحلة التسجيل أو ربما لن يتم تسليم الأحداث ببساطة. لقد ترميز لمعالجة هذه الحالات ولكن الآن تعمل. لسوء الحظ، بالطبع، سيفشل هذا إذا وعندما يتم قتل التطبيق على الإطلاق.

احتمال آخر هو استخدام isHomeScreenShowing() نوع من الطريقة، كما هو موضح هنا, ، المشار إليها بواسطة إجابة Xandy. الأفكار هناك ربما يمكن تحسينها عن طريق التخزين المؤقت القائمة التي تم إنشاؤها CATEGORY_HOME التطبيقات والاستماع إلى بث Action_Package_Edded / تغيير / إزالته لتحديثه.

استراتيجيتي هي:

  • حاول تجنب الاتصال به (عبر إنذار متكرر) عند عدم مرئية.
  • عند الاتصال، تحقق من حالة الشاشة ومؤشرات الرؤية الأخرى قبل القيام بأي شيء باهظ الثمن.
  • فقط ثم استدعاء IntentService للتعامل مع العمل باهظ الثمن نسبيا، يتضمن اتصال شبكة مستمر. هذا ضروري لمراقبة حالة خدمة عن بعد في الوقت الحقيقي القريب.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top