ذكري المظهر:كيفية التحقق من أن التطبيق قد تم إحضاره إلى الخلفية لتجنب عمليات فحص BroadcastReceiver غير الضرورية

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

سؤال

السؤال سهل بكل بساطة:

توضيح:

ما أفعله هو أن يكون لدي BroadcastReceiver الذي يتم استدعاؤه في كل مرة تتغير فيها حالة نظام تحديد المواقع العالمي (تمكين أو تعطيل) ويبلغ المستخدم إذا تم تعطيل نظام تحديد المواقع العالمي (GPS)، ويدعوه إلى إعادة تمكينه (إطلاق النية النسبية).

أقوم بتمكينه (وتعطيله في النهاية) في النشاط الجذر لتطبيقي، وبهذه الطريقة سيتم استدعاؤه لكل نشاط طفل.

تظهر مشكلتي عندما يضغط المستخدم على زر الصفحة الرئيسية (على سبيل المثال) أو يفتح تطبيقًا آخر ويعطل نظام تحديد المواقع العالمي (GPS). لا يزال الإشعار يظهر وهو يضع تطبيقي في المقدمة.

الرمز

مستقبل البث

public class GPSStatusReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String provider = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

        if (!provider.contains(LocationManager.GPS_PROVIDER)) {
            Intent gpsIntent = new Intent(context, GPSDialogActivity.class);
            gpsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            gpsIntent.putExtra(GPSDialogActivity.GPS_DIALOG_TITLE, "Attivazione GPS");
            gpsIntent.putExtra(GPSDialogActivity.GPS_DIALOG_MESSAGE, "E' necessario abilitare il GPS. Cliccare su 'Usa satelliti GPS'.");
            context.startActivity(gpsIntent);
        }
    }
}

تمكين/تعطيل فحص جهاز الاستقبال على onCreate وonDestroy للنشاط الجذر

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    *
    *
    Stuff
    *
    *

    ComponentName component=new ComponentName(this, GPSStatusReceiver.class);
    getPackageManager()
        .setComponentEnabledSetting(component,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
}

@Override
protected void onDestroy() {

    *
    *
    Stuff
    *
    *
    *

    ComponentName component=new ComponentName(this, GPSStatusReceiver.class);
    getPackageManager()
        .setComponentEnabledSetting(component,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);
    super.onDestroy();
}

الاحتياجات الأساسية

ما أحتاجه هو تعطيل اتصال BroadcastReceiver عندما ينتقل التطبيق إلى الخلفية وتمكينه عندما يعود التطبيق إلى المقدمة

ماذا سيكون الأفضل

بعد الاحتياجات المذكورة أعلاه:

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

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

المحلول

وهذا هو أحد الأسباب التي تجعل الأجزاء مفيدة.إذا لديك واحدة Activity إدارة أجزاء متعددة، و onPause() و onResume() سيتعامل هذا النشاط مع تسجيل وإلغاء تسجيل جهاز الاستقبال هذا بشكل جيد، دون تعقيد أنشطة الطفل.

باستثناء ذلك، أوصي بتصنيف النشاط فرعيًا إلى "GpsReceiverActivity"، والتعامل مع تسجيل وإلغاء تسجيل جهاز الاستقبال هناك، واستخدام ذلك كفئة أساسية لجميع الأنشطة الأخرى التي ترغب في استقبال البث من خلالها.

سؤال مكتوب بشكل جيد، بالمناسبة.

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