abdulrahman-abdullah

Members
  • عدد منشوراتي

    7
  • تاريخ الإنضمام

  • تاريخ اخر زياره

السمعه بالموقع

0 Neutral

عن العضو abdulrahman-abdullah

  • الرتبه
    مبدع جديد
  1. السلام عليكم ، الله يسعدك شرح وافي و كافي .. ومنظم وشامل. 🌹🌹 في إنتظار المزيد ...
  2. بسم الله الرحمن الرحيم السلام عليكم ورحمة الله تكلمت في مقالتين سابقتين عن الـ Broadcast في هذي المقالة سأتكلم عن أنواع الـ Broadcast و الفرق بين كل نوع و أخر . كما تعلم عزيز القارئ ان الـ Broadcast ينقسم الى أربع أنواع- تكلمت عنها في المقالة السابقة- وهي مقسمة كما في الصورة التالية : النوع الأول وهــو الـ Normal : يستخدم دالة الــ sendBroadcast غير متزامن عند عملية التنفيذ . في المقالة السابقة ، شرحت هذا النوع بالتفصيل . النوع الثاني وهــو الـ Ordered : يستخدم دالة الــ sendOrderedBroadcast متزامن عند علمية التنفيذ ، اي يقوم بتنفيذ العملية على حسب الأولوية . كيف يعني ؟؟ نفرض ان لديك - Action - واحد فقط يتم إستدعائه من ثلاث كلاسات مختلفة و ليكن اسم الكلاسات هي Class A & Class B & Class C .. الأن تريد تنفيذ الحدث الموجود في كلاس C قبل كلاس A أو كلاس B ، أو ربما تريد تنفيذ الحدث B ثم C ثم A .. كما في الصور التالي : تم تعريف - Action - واحد في ملف - Mainfest - كما في الصورة : لاحظ عزيز المبرمج انها تم تعريف اكشن واحد بنفس الاسم ، وكذلك تم تحديد الأولوية في عملية التنفيذ من خلال - android:priority - أعلى قيمة يتم تنفيذها أولاً ،ثم القيم الأقل منها .. وعند تنفيذ الطلب يتم تمرير اسم الاكشن وهو يتولى المهمة عنك MainActivity.java public class MainActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent("uniq.action"); sendOrderedBroadcast(intent,null); } } لاحظ انه تم تمرير اسم الــ Action عند إنشاء أوبجكت من كلاس الــ Intent . النوع الثالث الــ Sticky Broadcast : يعمل هذا النوع من الـ Broadcast بنفس آلية عمل الـ Normal Broadcast و لكن الفرق الــ Normal ينفذ الحدث و ينتهي عمل الــ Broadcast أي يعمل بمبدأ الــ Dies Quickly Broadcast أما الــ Sticky Broadcast يبقى قريب من التطبيق حتى بعد تنفيذ الحدث - event - ويراقب- أو ينتظر بمعنى- أخر وقوع الحدث مرة أخرى أي انه ينفذ ثم ينتظر .. ينفذ ينتظر .. وهكذا . في الأصدارات ما قبل 21 كأن يستخدم دالة sendStickyBroadcast و لكن من إصدار 21 و ما فوق تم التجاهل و التخلي عن هذي الدالة لأسباب تتعلق بضعف الحماية . ربما تقول بما أنه تم تجاهل هذا النوع لماذا نتطرق له ؟ مازال توجد بعض الــ Actions تستخدم هذا النوع وهي : Action_Battery_Changing Battery_Status_Charging Battery_Status_Discharging Battery_Status_Full Battery_Status_Plugged_USB Action_Device_Storage_Low Action_Dock_Event هذا جزء من الــ Documentation : هذي الــ Actions تبقى قريبة من النظام وكذلك من التطبيقات فعند حدوث أي منها يتم إرسال تنبيه الى التطبيقات فالنفرض ان لدي تطبيق يظهر حالة التغير في البطارية وعند كل تغير يقوم بتنفيذ حاجة معينة مثال عملي : تطبيق يظهر نص التغير في حالة البطارية ويظهر لي نص بذلك . public class MainActivity extends AppCompatActivity { private TextView mText ; private int ctr = 0 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mText = findViewById(R.id.txv_show_mes); } // object of BroadcastReceiver. BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS,-1); displayStatus(status); } }; // call registerReceiver method . @Override protected void onResume() { super.onResume(); IntentFilter mIntent = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); registerReceiver(receiver,mIntent); } // call unregisterReceiver method . @Override protected void onPause() { super.onPause(); unregisterReceiver(receiver); } private void displayStatus(int status){ switch (status){ // تستطيع العودة الى الارقام المذكرو من كلاس الــ // BatteryManager.java case 1 : setmText("Battery Status Unknown "); break; case 2: setmText("Battery Status Charging"); break; case 3 : setmText("Battery Status Discharging"); break; case 4: setmText("Battery Status Not Charging."); break; case 5: setmText("Battery Status Full ."); break; default: setmText(""); } } private void setmText(String str){ mText.setText(str); } } تغير وضع حالة البطارية من خلال : الأن عند تغير كل قيمة يظهر لي نص بحالة البطارية : النوع الرابع وهــــو الــ LocalBroadcast : هـــو عبارة عن ارسال و استقبال بيانات محلية - local - من داخل التطبيق أو من تطبيق الى تطبيق أخر . أي بمعنى - لا يستقبل بيانات من النظام و لا يرسل بيانات الى النظام . من مميزات الـــ LocalBroadcast هي التواصل : بين الــ Activities بين الــ Activity و Service بين الــ Activity و الــ Broadcast بين الــ Service و الــ Broadcast ، وكذلك العكس بين التطبيقات مثلا تطبيق A يرسل بيانات الى التطبيق B - إذا تم تمهيد وقبول التصاريح . يعتبر هذا النوع من الـ Broadcast الأكثر حماية لأنه : يعمل داخل التطبيق فقط . الـ Broadcast لا يخرج من التطبيق . وكذلك التطبيقات الأخر لا يمكنها الوصول الى الــ receiver لأن نوع الـ Action يكون خاص بالتطبيق فقط . أكثر فعالية لعدم تسريب البيانات خارج التطبيق. صورة لتوضيح طريقة عمل هذا النوع : أخيراً ، مثال عملي لهذا النوع من الــ Broadcast ، هـــو عمل برنامج ارسال بيانات من الــ Activity الى BroadcastReceiver - كما هو موضح في الصورة السابقة MainActivity.java public class MainActivity extends AppCompatActivity { LocalBroadcastManager mLocal ; EditText num1,num2 ; TextView txvResult ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); num1 = findViewById(R.id.edt_num1); num2 = findViewById(R.id.edt_num2); txvResult = findViewById(R.id.txv_result); mLocal = LocalBroadcastManager.getInstance(this); } public void sendLocalBroadcast(View view) { Intent sendIntent = new Intent(this,MyReceiver.class); // set two numbers .. int a1 = Integer.valueOf(num1.getText().toString()); int a2 = Integer.valueOf(num2.getText().toString()); sendIntent.putExtra("a1",a1); sendIntent.putExtra("a2",a2); // Send Normal Broadcast .. sendBroadcast(sendIntent); } @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter("my.result.sum"); mLocal.registerReceiver(receiver,intentFilter); } @Override protected void onPause() { super.onPause(); mLocal.unregisterReceiver(receiver); } // Dynamic Receiver ... private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int sum = intent.getIntExtra("sum",0); txvResult.setText(String.valueOf(sum)); } }; } MyReceiver.java public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { int a1 = intent.getIntExtra("a1",-1); int a2 = intent.getIntExtra("a2",-1); int sum = a1 + a2 ; LocalBroadcastManager localBroadcast= LocalBroadcastManager.getInstance(context); // declare new intent to put in send broadcast . Intent sendIntent = new Intent("my.result.sum"); sendIntent.putExtra("sum",sum); // Now this value of sendIntent send to localBroadcast, And in MainActivity, I'll declare new Dynamic receiver // To take this value. localBroadcast.sendBroadcast(sendIntent); } } AndroidMainfest.xml <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".MyReceiver"/> </application> ما تم عمله : إنشاء حلقين من نوع EditText لكتابة الارقام . عمل دالة لانشاء حدث عند الضغط على زر الارسال . في داخل هذا الاكشن تم إنشاء اوبجكت من كلاس Intent ويشير الى كلاس الــ MyReceiver . بعد ذلك يتم ارسال البيانات من خلال استخدام دالة الــ sendBroadcast كلاس الــ MyReceiver يرث من كلاس الــ BroadcastReceiver ويستقبل عددين مرسل له من كلاس الــ MainActivity . إنشاء متغير جديد يقوم بعملية جمع المتغيرين ، ثم يرسلها الى MainActivity من خلال LocalBroadcastManager . في كلاس ال MyReceiver تم إنشاء اوبجكت من كلاس الــ Intent و وضع اسم للاكشن ، بحيث يتم استقبال هذا الاكشن في كلاس الــ MainActivity عن طريق عمل dynamic receiver . في كلاس الــ MainActivity تم إنشاء اوبجكت من كلاس الــ LocalBroadcastManager ، بحيث يكون هذا الاوبجكت هو المسؤول عن تسجيل receiver عند تشغيل التطبيق في الأخير تم إنشاء حقل من نوع TextView لعرض النتيجة المرسلة من كلاس MyReceiver في الــ MainActivity . "في الأخير لاحظ ان هذا النوع من الــ Broadcast يستخدم الــ طريقة الــ statically broadcast مع طريقة الــ dynamic broadcast " أتمنى أني وفقت في تبسيط إيصال المفاهيم ، وأعتذر على الاطالة . هذا وإن كان من صواب فمن الله ،، وإن كان من خطأ فمن نفسي و الشيطان . سبحانك اللهم وبحمدك أشهد أن لا إله إلا أنت أستغفرك وأتوب اليك .
  3. ممتاز ، شكرا حبيبي سطام ، كأن فرق في الـ syntax
  4. السلام عليكم ور حمة الله وبركاته ،، أسعد الله أوقاتكم بكل خير ... في البداية سؤالي فضولي فقط ،، وليس مقارنة بين لغتين !!! كتبت كود يقرأ البيانات من صفحة url بإستخدام الجافا ،، وبعدين قلت بجرب بإستخدام البايثون .. بعد التنفيذ للكودين ، حصلت فرق في النتيجة ، البايثون يجلب كل كملة على حد ، أما الجافا تجلب سطر كامل ؟؟ ما سبب ؟ java code public class Main { public static void main(String[] args) { // write your code here try { URL url = new URL("http://sixty-north.com/c/t.txt"); URLConnection connection = url.openConnection(); InputStream inStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inStream)); String line = null ; int i = 0 ; while ((line = reader.readLine()) != null){ i++; System.out.println(i + "-"+line); } } catch(MalformedURLException ex){ } catch (IOException e) { e.printStackTrace(); } } } java result 1-It was the best of times 2-it was the worst of times 3-it was the age of wisdom 4-it was the age of foolishness 5-it was the epoch of belief 6-it was the epoch of incredulity 7-it was the season of Light 8-it was the season of Darkness 9-it was the spring of hope 10-it was the winter of despair 11-we had everything before us 12-we had nothing before us 13-we were all going direct to Heaven 14-we were all going direct the other way 15-in short the period was so far like the present period that some of 16-its noisiest authorities insisted on its being received for good or for 17-evil in the superlative degree of comparison only Process finished with exit code 0 python code import this from urllib.request import urlopen def fetch_words(): i = 0 with urlopen("http://sixty-north.com/c/t.txt") as story : story_words =[] for line in story : line_words = line.decode("utf-8").split() for word in line_words: story_words.append(word) for word in story_words: i += 1 print(i , word) fetch_words() python result 1 It 2 was 3 the 4 best 5 of 6 times 7 it 8 was 9 the 10 worst 11 of 12 times 13 it 14 was 15 the 16 age 17 of 18 wisdom 19 it 20 was 21 the 22 age 23 of 24 foolishness 25 it 26 was 27 the 28 epoch 29 of 30 belief 31 it 32 was 33 the 34 epoch 35 of 36 incredulity 37 it 38 was 39 the 40 season 41 of 42 Light 43 it 44 was 45 the 46 season 47 of 48 Darkness 49 it 50 was 51 the 52 spring 53 of 54 hope 55 it 56 was 57 the 58 winter 59 of 60 despair 61 we 62 had 63 everything 64 before 65 us 66 we 67 had 68 nothing 69 before 70 us 71 we 72 were 73 all 74 going 75 direct 76 to 77 Heaven 78 we 79 were 80 all 81 going 82 direct 83 the 84 other 85 way 86 in 87 short 88 the 89 period 90 was 91 so 92 far 93 like 94 the 95 present 96 period 97 that 98 some 99 of 100 its 101 noisiest 102 authorities 103 insisted 104 on 105 its 106 being 107 received 108 for 109 good 110 or 111 for 112 evil 113 in 114 the 115 superlative 116 degree 117 of 118 comparison 119 only سؤالي مثل ما ذكرت ، لماذا البايثون يجلب لي كلمة على حد ، لماذا لا تجلب سطر كامل ؟
  5. السلام عليكم ورحمة الله تكلمت في مقالة سابقة عن عمل الـ BoradcastReceiver بشكل مبسط جدً و كيف يتم إنشاء Static broadcastReceiver تستطيع العودة اليها من هنأ . في هذه المقالة سأتكلم عن الـ boradcastReceiver بشي من التفصيل .... 🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹 نبدأ بسم الله : لو القينا نظرة عن محتوى التطبيق - مكونات التطبيق - في الأندوريد نجد أنه يكون بهذي الصورة فتجد إن الـ BroadcastReceiver جزء من محتوى التطبيق - Application component - نحن الأن بصدد شرح المكون الثالث وهو ال BroadcastReceiver مفهوم الـــ BroadcastReceiver بشكل مبسط هــو عبارة عن ارسال أو استقبال حدث - event - من النظام الى التطبيق او من التطبيق الى تطبيقات أخرى .. مثلا : اتصال قادم أو الأشعارات عند اكتمال تحميل ملف معين أو الدخول في وضع الطيران أو توفر شبكة وافاي أو انخفاض مستوى البطارية .... الخ لو أخذنا مثال على الدخول في وضع الطيران ، هنا النظام يرسل تنبيه الى جميع التطبيقات أنه تم الدخول في وضع الطيران ، فإذا كان تطبيقي - يستقبل حدث مثل هذا - نفذ الكود التالي .. أو في حالة الاتصال - اتصال قادم - هنأ النظام يرسل تنبيه الى جميع التطبيقات أنه يوجد اتصال قادم ... صورة توضيحية : 🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹 ينقسم ال BroadcastReceiver الى أربع أنواع وهــي : والأكثر استخداماً هي النوعين ال Normal و Ordered الأن تريد تسجيل حدث - مستقبل - لتطبيقك ، مثل ما ذكرت في المقالة السابقة يمكنك إنشاء حدث جديد بطريقتين : الطريقة الأولى وهي الـ statically تكلمت عنها في المقالة السابقة تسطتيع الرجوع إليها من هنأ . الطريقة الثانية : هي الـ dynamic يقصد بها تسيجل الحدث برمجيا - programmatically - عن طريق كتابة كود برمجي ، فعند عمل التطبيق يتم تنفيذ أو تسجيل هذا الحدث و عند الخروج من التطبيق لا ينفذ . من مميزات هذه الطريقة : يتم التنفيذ وقت الأستدعاء . بعض ال - actions - لا يمكن تنفيذها الا بهذه الطريقة مثل Time_Tick إذا كان الـ minSdkVersion 26 - اي اصدار الاندوريد 7 و ما فوق يجب استخدام هذه الطريقة إذا أردت عمل ConnectivityManager ☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕ تعتمد طريقة الـ dynamic أو - Context.registerReceiver على دالتين أساسية وهي : registerReceiver() unregisterReceiver() #/ دالة الــ registerReceiver : تأخذ هذي الدالة بارامترين : أوبجكت من كلاس الــ BroadcastReceiver . أوبجكت من كلاس الـ IntentFilter و بداخله يتم تمرير الـ action . مثلاً : و دالة الــ unregisterReceiver يمرر لها الاوبجكت من كلاس الــ broadcastReceiver . #/ السؤال المهم أين يتم كتابة هذي الدالتين ، registerReceiver و unregisterReceiver ؟ الأفضل أن تُكتب دالة الــ registerReceiver في الــ onResume و تكتب دالة الـ unregisterReceiver في الـ onPause . ويمكنك أيضاً كتابة دالة الــ registerReceiver في الـ onCreate و يجب كتابة الـ unregisterReceiver في الـ onDestory . ولكن تجنب كتابة دالة الــ unregisterReceiver في الـ onSaveInstanceState لأنه عند الرجوع الى الـ Activity لا يتم تنفيذها . نأخذ مثال عملي عند التغير الى وضع الطيران : java Code Kotlin Code لاحظ أن عند الخروج من التطبيق لا يتم تنفيذ الـ receiver ما تم عمله التالــي : إنشاء اوبجكت - object - من كلاس الـ BroadcastReceiver . في داخل دالة الــ onReceive ، تظهر رسالة بدخول في وضع الطيران أو الخروج منه . في دالة الــ onResume ، انشائنا أوبجكت من كلاس الــ IntentFilter و تم تمرير الـ Action الى هذا الاوبجكت وهــو Intent.Action_AIRPLANE_MODE_CHANGED . << بالمناسبة تستطيع مشاهدة جميع الــ actions الموجودة في النظام من ملف الــ broadcast_action.txt الموجود في المسار التالي : << SDK-> platform->android-${api level} -> data -> broadcast_action.txt تم تسجيل الــ receiver من خلال دالة الـ registerReceiver وكذلك مررنا لها الـ receiver و ايضا الـ mIntent أخيرأ في الـ onPause كتابنا دالة إلغاء المستقبل - إن صح التعبير - و مررنا لها الـ receiver . ⚠️ ملاحظة مهمة جداً : يجب كتابة دالة الــ unregisterReceiver في حال لم تقم بكتابتها سيظهر خطأ الـ Leaked Intent فيحدث أغلاق مفاجى للتطبيق أو يبدأ التطبيق في استهلاك البطارية . 🏋️ تمرين : حاول تطبيق الكود السابق بطريقة الـ statically BoradcastReceiver - تم شرحها هنأ - هل يوجد فرق بين الطريقتين ؟ أترك لنا تعليق يوضح الفرق ؟ والسلام خير ختام .
  6. السلام عليكم ورحمة الله تكلمت في مقالة سابقة عن عمل الـ BoradcastReceiver بشكل مبسط جدً و كيف يتم إنشاء Static broadcastReceiver تستطيع العودة اليها من هنأ . في هذه المقالة سأتكلم عن الـ boradcastReceiver بشي من التفصيل .... 🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹 نبدأ بسم الله : لو إلقينى نظرة عن محتوى التطبيق - مكونات التطبيق - في الأندوريد نجد أنه يكون بهذي الصورة فتجد إن الـ BroadcastReceiver جزء من محتوى التطبيق - Application component - نحن الأن بصدد شرح المكون الثالث وهو ال BroadcastReceiver مفهوم الـــ BroadcastReceiver بشكل مبسط هــو عبارة عن ارسال أو استقبال حدث - event - من النظام الى التطبيق او من التطبيق الى تطبيقات أخرى .. مثلا : اتصال قادم أو الأشعارات عند اكتمال تحميل ملف معين أو الدخول في وضع الطيران أو توفر شبكة وافاي أو انخفاض مستوى البطارية .... الخ لو أخذنا مثال على الدخول في وضع الطيران ، هنأ النظام يرسل تنبيه الى جميع التطبيقات أنه تم الدخول في وضع الطيران ، فإذا كان تطبيقي - يستقبل حدث مثل هذا - نفذ الكود التالي .. أو في حالة الاتصال - اتصال قادم - هنأ النظام يرسل تنبيه الى جميع التطبيقات أنه يوجد اتصال قادم ... صورة توضيحية : 🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹 ينقسم ال BroadcastReceiver الى أربع أنواع وهــي : والأكثر استخداماً هي النوعين ال Normal و Ordered الأن تريد تسجيل حدث - مستقبل - لتطبيقك ، مثل ما ذكرت في المقالة السابقة يمكنك إنشاء حدث جديد بطريقتين : الطريقة الأولى وهي الـ statically تكلمت عنها في المقالة السابقة تسطتيع الرجوع إليها من هنأ . الطريقة الثانية : هي الـ dynamic يقصد بها تسيجل الحدث برمجيا - programmatically - عن طريق كتابة كود برمجي ، فعند عمل التطبيق يتم تنفيذ أو تسجيل هذا الحدث و عند الخروج من التطبيق لا ينفذ . من مميزات هذه الطريقة : يتم التنفيذ وقت الأستدعاء . بعض ال - actions - لا يمكن تنفيذها الا بهذه الطريقة مثل Time_Tick إذا كان الـ minSdkVersion 26 - اي اصدار الاندوريد 7 و ما فوق يجب استخدام هذه الطريقة إذا أردت عمل ConnectivityManager ☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕☕ تعتمد طريقة الـ dynamic أو - Context.registerReceiver على دالتين أساسية وهي : registerReceiver() unregisterReceiver() #/ دالة الــ registerReceiver : تأخذ هذي الدالة بارامترين : أوبجكت من كلاس الــ BroadcastReceiver . أوبجكت من كلاس الـ IntentFilter و بداخله يتم تمرير الـ action . مثلاً : و دالة الــ unregisterReceiver يمرر لها الاوبجكت من كلاس الــ broadcastReceiver . #/ السؤال المهم أين يتم كتابة هذي الدالتين ، registerReceiver و unregisterReceiver ؟ الأفضل أن تُكتب دالة الــ registerReceiver في الــ onResume و تكتب دالة الـ unregisterReceiver في الـ onPause . ويمكنك أيضاً كتابة دالة الــ registerReceiver في الـ onCreate و يجب كتابة الـ unregisterReceiver في الـ onDestory . ولكن تجنب كتابة دالة الــ unregisterReceiver في الـ onSaveInstanceState لأنه عند الرجوع الى الـ Activity لا يتم تنفيذها . نأخذ مثال عملي عند التغير الى وضع الطيران : java Code Kotlin Code لاحظ أن عند الخروج من التطبيق لا يتم تنفيذ الـ receiver ما تم عمله التالــي : إنشاء اوبجكت - object - من كلاس الـ BroadcastReceiver . في داخل دالة الــ onReceive ، تظهر رسالة بدخول في وضع الطيران أو الخروج منه . في دالة الــ onResume ، انشائنا أوبجكت من كلاس الــ IntentFilter و تم تمرير الـ Action الى هذا الاوبجكت وهــو Intent.Action_AIRPLANE_MODE_CHANGED . << بالمناسبة تستطيع مشاهدة جميع الــ actions الموجودة في النظام من ملف الــ broadcast_action.txt الموجود في المسار التالي : << SDK-> platform->android-${api level} -> data -> broadcast_action.txt تم تسجيل الــ receiver من خلال دالة الـ registerReceiver وكذلك مررنا لها الـ receiver و ايضا الـ mIntent أخيرأ في الـ onPause كتابنا دالة إلغاء المستقبل - إن صح التعبير - و مررنا لها الـ receiver . ⚠️ ملاحظة مهمة جداً : يجب كتابة دالة الــ unregisterReceiver في حال لم تقم بكتابتها سيظهر خطأ الـ Leaked Intent فيحدث أغلاق مفاجى للتطبيق أو يبدأ التطبيق في استهلاك البطارية . 🏋️ تمرين : حاول تطبيق الكود السابق بطريقة الـ statically BoradcastReceiver - تم شرحها هنأ - هل يوجد فرق بين الطريقتين ؟ أترك لنا تعليق يوضح الفرق ؟ والسلام خير ختام .
  7. أهلا وسهلاً بكم في لمحة مبسطة عن الــ BroadcastReceiver ، سأتكلم في هذي المقالة عن تعريف الـ BroadcastReceiver و طريقة اضافتها لبرنامجك .. تنويه : اللغة المستخدمة في الشرح هي kotlin ماهو BroadcastReceiver ؟ هو عبارة عن أرسال و استقبال بين البرنامج و النظام ، عند حدوث event معين يكون معرف مسبقا في النظام او يتم تعريفه من قبل المبرمج . في البداية دعنا نلقي نظرة على المعرفة مسبقا في النظام - بعض منها : Battery Low WI-Fi connected BATTERY_OKAY Incomming SMS AIRPLANE_MODE BATTERY_CHANGED ACTION_POWER_CONNECTED الأن عندما تريد إنشاء حدث معين أنت أمام خيارين هما : statically BroadcastReceiver * هو اضافة حدث في ملف الـــ AndroidMainfest.xml أو Dynamic BroadcastReceiver * تسجيل الحدث بإستخدام ال جافا / الكوتلين داخل ال activity . ملاحظة : ال BroadcastReceiver لا يقبل عمليات تاخذ وقت في تنفيذها مثل استخرج بيانات أو ارسال بيانات او عمل مؤقت .... الخ ، لانه يعمل في ال main thread . لنأخذ مثال بسيطا لعمل برنامج يظهر نص عند الضغط على الزر بإستخدام الــ statically BroadcastReceiver : في البداية دعنا ننشي كلاس يظهر لي رسالة عند ضعط المستخدم على الزر وليكن اسم هذا الكلاس : MybroadcastReceiver class MybroadcastReceiver:BroadcastReceiver() { override fun onReceive(p0: Context?, p1: Intent?) { Toast.makeText(p0!!," Hello form First receiver ",Toast.LENGTH_LONG).show() } } الان ننتقل الى كلاس ال MainActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // send receiver when clicked button btn_sendReceiver.setOnClickListener({ // declared intent and pass MybroadcastReceiver ... var intent = Intent(this,MybroadcastReceiver::class.java) sendBroadcast(intent) }) } الأن في ملف ال AndroidMainfest.xml نقوم بتسجل هذا الحدث : // After activity tag .. <receiver android:name=".MybroadcastReceiver"> </receiver> النتيجة : Pesudo Code 1 - craete subClass extends BroadcastReceiver . 2 -override the onReceiver method . 3- add receiver on AndroidMainfest.xml 4 - create event to send data . 5 - declaerd intent . 6 - sendBroadcastReceiver(intent) . #### عمل ( InnerClass BroadcastReceiver ) بنفس عمل الآلية السابقة ، نحتاج الى كلاس يراث من broadcastReceiver و أكشن يشير الى هذا الكلاس ... هذي المرة سأقوم بتعريف كلاس داخلي يشير الى الأكشن .. MainActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // send receiver when clicked button btn_sendReceiver.setOnClickListener({ // declared intent and put action ... var intent = Intent("send.msg.receiver") sendBroadcast(intent) }) } /***** Start InnerClass **************/ public class MybroadcastInner:BroadcastReceiver(){ override fun onReceive(p0: Context?, p1: Intent?) { Toast.makeText(p0!!," Hello form InnerReceiver receiver ",Toast.LENGTH_LONG).show() } } /***** End InnerClass **************/ } لاحظ انه تم تمرير اكشن - action - في ال intent ، هذا الاكشن سيتم تعريفه في ملف الــ AndroidMainfest.xml ملاحظة : عند كتابة الكود بالجافا تحتاج الى اضافة كلمة static قبل اسم الكلاس الداخلي مثلا : public static class MybroadcastInner extends BroadcastReceiver{} ملف ال AndroidMainfest.xml : // After activity Tag . <receiver android:name=".MainActivity$MybroadcastInner"> <intent-filter> <action android:name="send.msg.receiver"/> </intent-filter> </receiver> لاحظ انه تم تعريف الكلاس الاساسي ثم تم وضع علامة ( $) قبل اسم الكلاس الداخلي لكي يتمكن ملف الاندرويد من التعرف على الكلاس الداخلي ثم بعد ذلك تم إنشاء intent-filter بداخله اكشن - action - لاحظ ان اسم الاكشن هو نفس الاسم الذي تم تمريره لل intent . فعند التنفيذ ستظهر نفس النتيجة . في هذا الجزء تم التعرف على كتابة كلاس داخلي ، و الوصول له من خلال ملف AndroidMainfest.xml تنويه : يمكنك تمرير أكشن الى الــ Intent حتى لو كان ال BroadcastReceiver في كلاس منفصل ، مثل ما عملنا في الجزء السابق . في المقالة القادمة ، سأتحدث عن Dynamic BroadcastReceiver . دمتم بخير .
  8. أهلا وسهلاً بكم في لمحة مبسطة عن الــ BroadcastReceiver ، سأتكلم في هذي المقالة عن تعريف الـ BroadcastReceiver و طريقة اضافتها لبرنامجك .. تنويه : اللغة المستخدمة في الشرح هي kotlin ماهو BroadcastReceiver ؟ هو عبارة عن أرسال و استقبال بين البرنامج و النظام ، عند حدوث event معين يكون معرف مسبقا في النظام او يتم تعريفه من قبل المبرمج . في البداية دعنا نلقي نظرة على المعرفة مسبقا في النظام - بعض منها : Battery Low WI-Fi connected BATTERY_OKAY Incomming SMS AIRPLANE_MODE BATTERY_CHANGED ACTION_POWER_CONNECTED الأن عندما تريد إنشاء حدث معين أنت أمام خيارين هما : statically BroadcastReceiver * هو اضافة حدث في ملف الـــ AndroidMainfest.xml أو Dynamic BroadcastReceiver * تسجيل الحدث بإستخدام ال جافا / الكوتلين داخل ال activity . ملاحظة : ال BroadcastReceiver لا يقبل عمليات تاخذ وقت في تنفيذها مثل استخرج بيانات أو ارسال بيانات او عمل مؤقت .... الخ ، لانه يعمل في ال main thread . لنأخذ مثال بسيطا لعمل برنامج يظهر نص عند الضغط على الزر بإستخدام الــ statically BroadcastReceiver : في البداية دعنا ننشي كلاس يظهر لي رسالة عند ضعط المستخدم على الزر وليكن اسم هذا الكلاس : MybroadcastReceiver class MybroadcastReceiver:BroadcastReceiver() { override fun onReceive(p0: Context?, p1: Intent?) { Toast.makeText(p0!!," Hello form First receiver ",Toast.LENGTH_LONG).show() } } الان ننتقل الى كلاس ال MainActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // send receiver when clicked button btn_sendReceiver.setOnClickListener({ // declared intent and pass MybroadcastReceiver ... var intent = Intent(this,MybroadcastReceiver::class.java) sendBroadcast(intent) }) } الأن في ملف ال AndroidMainfest.xml نقوم بتسجل هذا الحدث : // After activity tag .. <receiver android:name=".MybroadcastReceiver"> </receiver> النتيجة : Pesudo Code 1 - craete subClass extends BroadcastReceiver . 2 -override the onReceiver method . 3- add receiver on AndroidMainfest.xml 4 - create event to send data . 5 - declaerd intent . 6 - sendBroadcastReceiver(intent) . #### عمل ( InnerClass BroadcastReceiver ) بنفس عمل الآلية السابقة ، نحتاج الى كلاس يراث من broadcastReceiver و أكشن يشير الى هذا الكلاس ... هذي المرة سأقوم بتعريف كلاس داخلي يشير الى الأكشن .. MainActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // send receiver when clicked button btn_sendReceiver.setOnClickListener({ // declared intent and put action ... var intent = Intent("send.msg.receiver") sendBroadcast(intent) }) } /***** Start InnerClass **************/ public class MybroadcastInner:BroadcastReceiver(){ override fun onReceive(p0: Context?, p1: Intent?) { Toast.makeText(p0!!," Hello form InnerReceiver receiver ",Toast.LENGTH_LONG).show() } } /***** End InnerClass **************/ } لاحظ انه تم تمرير اكشن - action - في ال intent ، هذا الاكشن سيتم تعريفه في ملف الــ AndroidMainfest.xml ملاحظة : عند كتابة الكود بالجافا تحتاج الى اضافة كلمة static قبل اسم الكلاس الداخلي مثلا : public static class MybroadcastInner extends BroadcastReceiver{} ملف ال AndroidMainfest.xml : // After activity Tag . <receiver android:name=".MainActivity$MybroadcastInner"> <intent-filter> <action android:name="send.msg.receiver"/> </intent-filter> </receiver> لاحظ انه تم تعريف الكلاس الاساسي ثم تم وضع علامة ( $) قبل اسم الكلاس الداخلي لكي يتمكن ملف الاندرويد من التعرف على الكلاس الداخلي ثم بعد ذلك تم إنشاء intent-filter بداخله اكشن - action - لاحظ ان اسم الاكشن هو نفس الاسم الذي تم تمريره لل intent . فعند التنفيذ ستظهر نفس النتيجة . في هذا الجزء تم التعرف على كتابة كلاس داخلي ، و الوصول له من خلال ملف AndroidMainfest.xml تنويه : يمكنك تمرير أكشن الى الــ Intent حتى لو كان ال BroadcastReceiver في كلاس منفصل ، مثل ما عملنا في الجزء السابق . في المقالة القادمة ، سأتحدث عن Dynamic BroadcastReceiver . دمتم بخير .

عالم البرمجة

عالم البرمجة مقالات برمجة و دورات مجانية لإحتراف البرمجة هدفنا تبسيط البرمجة ونشرها بيد الكل بشكل ممتع ومتطور ومحدث بإستمرار لمواكبة جديد تطورات البرمجة الحديثة و المتقدمة بدون مقابل