ورود

View Full Version : مقداردهی یک listener در کلاس BroadCast Reciever



CodeforLife
پنج شنبه 10 فروردین 1396, 17:33 عصر
سلام دوستان . من در یک کلاس که از Broadcastreciver ارپ بری میکنه ...یک Interface نوشتم که باید از بیرون کلاس مقداردهی بشه ... اینکار رو با Setter و ... امتحان کردم ...ولی بعد از اینکه میاد داخل OnRecieve() مقدار اون Null میشه و منجر به Crash برنامه میشه ...هر جور امتحان کردم مقدار نال میشه آیا راه دیگه ای دارید؟ راهنماییم کنید لطفا





public class CheckRequestAnswerReciever extends BroadcastReceiver {
private AnswerRequestType answerRequestType;
private ApiManager apiManager;
RequestSharedPref requestSharedPref = new RequestSharedPref();

public void setAnswerRequestType(AnswerRequestType answerRequestType) {
this.answerRequestType = answerRequestType;
}

@Override
public void onReceive(Context context, Intent intent) {
requestSharedPref.load();
if (requestSharedPref.isAccept() == false && requestSharedPref.isReject() == false) {
//it means we are in none state
answerRequestType.onNoneRequest("None");
}
}
public interface AnswerRequestType {
public void onNoneRequest(String type);
}
}





public class RequestingReciever extends BroadcastReceiver implements ApiManager.onResponseListener,
CheckRequestAnswerReciever.AnswerRequestType {
public RequestingReciever() {

}

private ApiManager apiManager;
private Activity activity;
private Context context;
private SharedPref sharedPref;
private static RequestListener requestListener;


public void setRequestListener(RequestListener requestListener) {
this.requestListener = requestListener;
}

@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
activity = new MainAccountActivity();
apiManager = new ApiManager();
apiManager.setResponseListener(this);
sharedPref = new SharedPref(apiManager.deliveryPartner, apiManager.deliveryPartner.deliveryBike, context);
sharedPref.loadData();
sendCheckDeliveryRequest();
}

private void checkNoneWorker() {
CheckRequestAnswerReciever checkRequestAnswerReciever=new CheckRequestAnswerReciever();
checkRequestAnswerReciever.setAnswerRequestType(th is);
Intent requestIntent = new Intent(context, CheckRequestAnswerReciever.class);

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 2, requestIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 50000, pendingIntent);//it counts 50 seconds...
}

rezaricky
پنج شنبه 10 فروردین 1396, 23:34 عصر
سلام . چرا از intent برای ارسال مقدار به broadcast receiver استفاده نمی گنید ؟ میتونید از طریق اینترقیس های Parclable یا Serializable این کار رو انجام بدید .

Intent intent = new Intent("sample_broadcast");
Foo foo = new Foo(); // class Foo implements parclable or serializable
intent.putExtra("foo ", foo);
sendBroadcast(intent);

CodeforLife
شنبه 12 فروردین 1396, 20:29 عصر
سلام و متشکرم ...من احتیاج به توضیح بیشتر دارم یعنی از broadcast میتونم intent کنم به اکتیویتی که میخوام بعد اکتیویتی که intent رو گرفت از اطلاعات ارسالی استفاده کنه؟؟؟این implementکردن از parclable یا serializer برای چیه؟ اگر امکانش هست بیشتر توضیح بفرمایید...باز هم ممنونم

rezaricky
شنبه 12 فروردین 1396, 23:37 عصر
با استفاده از intent شما میتونی کلاس هایی رو که یکی از اینترفیس های Serializable و یا Parclable رو پیاده سازی کردن منتقل کنید .
یک مثال با استفاده از Serializable :
کلاسی که میخوایم انتقال بدیم :

public class Foo implements Serializable {
private int id;
private String name;


public Foo(int id, String name) {
this.id = id;
this.name = name;
}


public String getName() {
return name;
}


public int getId() {
return id;
}
}


نحوه ارسال توسط intent :

Foo foo = new Foo(10, "reza");
intent.putExtra("foo", foo);
startActivity(intent); // or sendBroadcast(intent);


نحوه دریافت توسط intent :

Foo foo = (Foo) intent.getExtras().getSerializable("foo");




به همین سادگی .
البته بطور کلی توصیه میشه از Parclable بجای Serializable استفاده بشه چون سرعت بیشتری داره. اما پیاده سازی Serializable سریع تره.

CodeforLife
یک شنبه 13 فروردین 1396, 09:44 صبح
متشکرم ...من کاری که شما فرمودین رو انجام دادم .ولی به مسئله دیگری برخوردم وقتی که فرگمنت من باز هست .... برنامه میره داخل onrecieve , و دوباره فرگمنت رو باز میکنه و باید قبلی رو ببنده من سعی کردم داخل broadcastreciver این کار رو انجام بدم نشد و داخل خود اکتیوتی هم که انجام میدم دومین فرگمنت رو که تازه start کرده می بنده ...
راه حل هایی که پیشنهاد شده این هست که reciever رو بیارم داخل خور فرگمنت که بتونم ببندمش اون فرگمنت اولی رو قبل ازاینکه دومی رو start کنم ... آیا شما نظر دیگه ای دارید ..؟ مممنون از لطف شما

rezaricky
یک شنبه 13 فروردین 1396, 10:23 صبح
بدون دیدن کد نمیشه دقیق گفت .
یک راحل حل میتونه انطوری باشه :
broadcast receiver ها رو بیارید داخل فرگمنت و دو تا broadcast تعریف کنید:
1- برای بستن فرگمنت
2- broadcast فعلی که استفاده میکنید.

و قبل از ارسال نوع 2 ، نوع 1 رو ارسال کنید که اگر فرگمنتی باز هست و اون رو دریافت میکنه خودش رو ببنده . بعد از اون نوع 2 رو ارسال کنید.

CodeforLife
یک شنبه 13 فروردین 1396, 16:28 عصر
تلاشم رو کردم ولی هنوز نتونستم فرگمنت رو ببندم

CodeforLife
دوشنبه 14 فروردین 1396, 19:15 عصر
بسیار ممنونم دوست عزیز تونستم با استفاده از Local BroadCast Receiver این کار رو انجام بدم حتی دیگه
fragment
رو استارت هم نکردم ...این لینک رو میگذارم که اگر عزیزان به مشکل برخودن ازش استفاده کنند.
https://gist.github.com/Antarix/8131277