رفتن به مطلب

آموزش کار با Receiver در B4A


ارسال‌های توصیه شده

سلام و درود. امیدوارم حالتون خوب باشه

از بین چهار کامپوننت اصلی اندروید رسیورها یکی از مهمترینهاش هست. از اونها برای اسال رویداد بین برنامه ها و یا بین خود کامپوننتها استفاده میشه. همینطور برای دریافت اعلانهای سیستمی مثل اس ام اس یا تماس ازشون استفاده میشه. این قابلیت جدیدا به صورت نیتیو به b4a اضافه شده هر چند کامل این کار رو نکرده:aggressive:. بریم که ببینیم به چه شکل باید استفاده کنیم.

اول از منوی Project->Add New Module->Receiver Module یه رسیور مثلا به نام TestReceiver ایجاد میکنیم.

Sub Process_Globals
	
End Sub

Private Sub Receiver_Receive (FirstTime As Boolean, StartingIntent As Intent)
	Log(StartingIntent.Action)
End Sub

به طور کلی به دو صورت میتونیم رسیورها رو توی اندروید ثبت کنیم.

1- از طریق منیفست یا استاتیک:

یکی از روشهای ثبت رسیور از طریق منیفست هست. البته این روش برای اکثر اعلانها تو نسخه های جدید اندروید غیر فعال شده.

مثلا میخوایم بوت شدن دستگاه رو بفهمیم. به منیفست کدهای زیر رو اضافه میکنیم.

AddPermission(android.permission.RECEIVE_BOOT_COMPLETED)
AddReceiverText(TestReceiver, <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>)

2-از طریق کدنویسی یا داینامیک:

اینجا رو دیگه ارل یادش رفته و براش راه حلی نزاشته. ولی ما که نمیزاریم چیزی لنگ بمونه :gamer2: این روش روش پیشنهادی و استاندارد گوگل هست.

کدهای زیر رو به اکتیوتی یا سرویس اضافه کنید اضافه کنید.

#If java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.os.Build;
import java.lang.reflect.Constructor;


public void registerReceiver(Object receiverClass, String[] actions) throws Exception{
        IntentFilter intentFilter=new IntentFilter();
        for (String action:actions) {
            intentFilter.addAction(action);
        }
        String className=receiverClass.toString().replace("class ","");
        Class<?> clazz = Class.forName(className);
        Constructor<?> cons = clazz.getConstructor();
        cons.setAccessible(true);
        final BroadcastReceiver receiver =(BroadcastReceiver) cons.newInstance();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            registerReceiver(receiver,intentFilter,Context.RECEIVER_EXPORTED);
        }else {
            registerReceiver(receiver,intentFilter);
        }
    }

public void unregisterReceiver(Object receiverClass)  throws Exception{
        String className=receiverClass.toString().replace("class ","");
        Class<?> clazz = Class.forName(className);
        Constructor<?> cons = clazz.getConstructor();
        cons.setAccessible(true);
        BroadcastReceiver receiver =(BroadcastReceiver) cons.newInstance();
        unregisterReceiver(receiver);
    }	
#End If

و به صورت زیر رسیور رو ثبت کنید. مثلا میخوایم هر وقت دقیقه گوشی عوض شد متوجه بشیم.

Dim jo As JavaObject
jo.InitializeContext.RunMethod("registerReceiver",Array(TestReceiver,Array As String("android.intent.action.TIME_TICK")))

این مواردی که تا الان عرض شد برای اعلانهای سیستمی هست، اما یکی از مهمترین قابلیتهای رسیور اینه که ما میتونیم رسیور دلخواه خودمونو هم ثبت کنیم که خب خیلی کاربردی هست.

مثلا میخوایم یه اعلان با اکشن com.action.TEST ثبت کنیم. به صورت زیر ثبتش میکنیم

Dim jo As JavaObject
jo.InitializeContext.RunMethod("registerReceiver",Array(TestReceiver,Array As String("com.action.TEST")))

و حالا برای صدا زدن اعلان به شکل زیر عمل میکنیم. اول کتابخونه phone رو تیک میزنیم.

Dim phone As Phone
Dim i As Intent
i.Initialize("com.action.TEST","")
i.PutExtra("key","value")
phone.SendBroadcastIntent(i)

حتما توجه داشته باشین که بعد از استفاده اونو unregister کنید.به شکل زیر

Dim jo As JavaObject
jo.InitializeContext.RunMethod("unregisterReceiver",Array(TestReceiver,Null))

سورس هم پیوست شد

receiver.zip

مانا باشید:hi:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام من مراحل بالا رو پیش رفتم این ارور رو میده 

 

 

B4A Version: 12.50
Parsing code.    (0.00s)
    Java Version: 14
Building folders structure.    (0.01s)
Compiling code.    (0.01s)
Compiling layouts code.    (0.00s)
Organizing libraries.    (0.00s)
    (AndroidX SDK)
Compiling resources    (0.11s)
Linking resources    (0.37s)
Compiling generated Java code.    Error
src\b4a\example\main.java:472: error: unreported exception ClassNotFoundException; must be caught or declared to be thrown
        Class<?> clazz = Class.forName(className);
                                      ^
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 error
only showing the first 1 errors, of 3 total; use -Xmaxerrs if you would like to see more

javac 14.0.1
 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۲/۷/۲۸ در 21:33، سید رضا گفته است:

سلام من مراحل بالا رو پیش رفتم این ارور رو میده 

 

 

B4A Version: 12.50
Parsing code.    (0.00s)
    Java Version: 14
Building folders structure.    (0.01s)
Compiling code.    (0.01s)
Compiling layouts code.    (0.00s)
Organizing libraries.    (0.00s)
    (AndroidX SDK)
Compiling resources    (0.11s)
Linking resources    (0.37s)
Compiling generated Java code.    Error
src\b4a\example\main.java:472: error: unreported exception ClassNotFoundException; must be caught or declared to be thrown
        Class<?> clazz = Class.forName(className);
                                      ^
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 error
only showing the first 1 errors, of 3 total; use -Xmaxerrs if you would like to see more

javac 14.0.1
 

سلام

منم همین مشکل رو دارم

لینک ارسال
به اشتراک گذاری در سایت های دیگر

۱ ساعت قبل، مهدی عزیزی گفته است:

سلام

منم همین مشکل رو دارم

متاسفانه من چندین روزه پرسیدم کسی پاسخگو نیست 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۲/۸/۳ در ۲۰:۰۰، مهدی عزیزی گفته است:

سلام

منم همین مشکل رو دارم

 

در ۱۴۰۲/۸/۳ در ۲۱:۱۱، سید رضا گفته است:

متاسفانه من چندین روزه پرسیدم کسی پاسخگو نیست 

سلام و درود. پست ویرایش شد و سورس هم جهت راحتی کار پیوست شد.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .
توجه: مطلب ارسالی شما پس از تایید مدیریت برای همه قابل رویت خواهد بود.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
  • اضافه کردن...