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

السؤال

نشر

قمت بعمل كلاس يرث من BroadcastReceiver ليعمل في الخفاء. كالاتي:

public class aaa extends BroadcastReceiver {
    Context c;
    @Override
    public void onReceive(Context context, Intent intent){
//الكود الذي نريد تنفيذة في الخفاء
    {


وقمت بعملية الاستدعاء او التنفيذ كالاتي:
في ملف Androi Manifest. xml

<receiver           android:name=".aaa"      android:enabled="true" android:exported="true">
  <intent-filter>
    <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
  </intent-filter>
</receiver>


اي انة سيتم التنفيذ او الاستدعاء عندنا تتغير حالة wifi .
عندما قمت بتثبيت التطبيق (قمت بازالتة من التطبيقات المصغره) وغيرت حالة wifi تمت العملية بنجاح ، ولكن :
اذا تركت الهاتف مدة ثم قمت بتغيير حالة wifi لا يتم اي عمل.
الا اذا قمت بتشغيل التطبيق مرة اخرى وهكذا بعد كل مدة.
لو تفظلتم ممكن احد يفيدنا .
 

Recommended Posts

  • 1
نشر

المشكلة هي في محاولة اندرويد تحسين الأداء وتوفير الطاقة بشكل عام، حيث قد تكون عدة تطبيقات على الهاتف قد عينت BroadcastReciever لنفس الحدث فعند كل تشغيل أو إغلاق للواي فاي سيتم استدعاء مثلا 30 BroadcastReciever معا مما يؤدي لضعف في أداء الهاتف.

لذا اندرويد (بدءا من API المستوى 26 وفوق) لا يقوم باستدعاء ال BroadcastReciever الخاص بأي تطبيق إذا كان نائما (في حالة Sleep) فقط عندما يكون التطبيق يعمل سيستقبل الحدث

  • 1
نشر
بتاريخ On 12/6/2021 at 20:08 قال رفيق مشعيل الوادعي:

 انا فقط بدلا من جعل العمل يتنفذ في فترات زمنيه متعاقبه جعلته يتنفذ عند حدوث تغيير في حالة wifi.

 

بتاريخ On 12/6/2021 at 10:48 قال Hassan Hedr:

لذا اندرويد (بدءا من API المستوى 26 وفوق) لا يقوم باستدعاء ال BroadcastReciever الخاص بأي تطبيق إذا كان نائما (في حالة Sleep) فقط عندما يكون التطبيق يعمل سيستقبل الحدث

حدد target api بقيمة 25 مثلاً، (أو حتى 23) لأنه في غير هذه الأمور سيتم تجاهل أي مستقبل حدث عام غير مخصص لتطبيقك.

الجزء التالي مقتبس من توثيق أندرويد:

اقتباس

If your app targets Android 8.0 or higher, you cannot use the manifest to declare a receiver for most implicit broadcasts (broadcasts that don't target your app specifically). You can still use a context-registered receiver when the user is actively using your app.

يمكنك ربط تطبيقك بتغير حالة الشاشة مثلاً ScreenOnOffActivity أي ليس فقط حالة wifi

<intent-filter>
  <action android:name="android.intent.action.BOOT_COMPLETED"/>
  <action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
  <activity android:name=".broadcast.activity.ScreenOnOffActivity"/>

</intent-filter>

 

  • 0
نشر
بتاريخ 2 ساعات قال رفيق هادي مبارك هادي مشعيل:

ولكن الا يوجد طريقه لاجعل تطبيقي يعمل (مثل المنبه) حتى ولو كان في حلة sleep

المنبة لا يعمل بطريقة BroadcastReciever بل يستخدم مدير التنبيهات AlarmManager، المشكلة لا يمكنك التحكم متى سيذهب تطبيقك لحالة Sleep من قبل النظام، يعتمد ذلك على العمل الذي ترغب في فعله فقد تجد طريقة أخرى لتنفيذه

  • 0
نشر
بتاريخ 2 ساعات قال Hassan Hedr:

المنبة لا يعمل بطريقة BroadcastReciever بل يستخدم مدير التنبيهات AlarmManager، المشكلة لا يمكنك التحكم متى سيذهب تطبيقك لحالة Sleep من قبل النظام، يعتمد ذلك على العمل الذي ترغب في فعله فقد تجد طريقة أخرى لتنفيذه

ولكن AlarmManager يستدعي كلاس BroadcastReceiver

 انا فقط بدلا من جعل العمل يتنفذ في فترات زمنيه متعاقبه جعلته يتنفذ عند حدوث تغيير في حالة wifi.

 

المشكلة هي في ان النظام يحاول ان يجعل النظام يعمل باداء جيد كما اسلفت انت ولحل المشكلة على مستخدم التطبيق ان يقوم بقفل التطبيق حتى لا يتم ازالته من الرام تلقائيا 

 

الصورة التاليه توضح ذلك

بتاريخ 2 ساعات قال Hassan Hedr:

 

 

Screenshot_٢٠٢١١٢٠٦_٢١١٢١٩.jpg

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...