ورود

View Full Version : کار با broad cast reciver و alarm manager



CodeforLife
شنبه 21 اسفند 1395, 01:00 صبح
سلام دوستان من در قسمتی از پروژه می خوام که در background برنامه , یه سری اطلاعات برن سمت سرور و این در یه بازه زمانی مثلا یه ثانیه یه ثانیه باشه.
این کد رو نوشتم که اجرا نمی شه یعنی اصلا در تابع onrecieve()نمیره که بخواد به سمت سرور درخواست بده ...
کدها رو میگذارم میشه لطفا راهنمایی کنید ...



Intent intent = new Intent(getContext(), ApiManager.class);
//get intent extras
PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager)getContext().getSystemService(Contex t.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000, 1000, pendingIntent);


این کدها در یه فرگمنت هست که باید بگه هر ثانیه یه بار برو تو کلاس ApiManager و درخواست بده

public class ApiManager extends BroadcastReceiver {
public ApiManager() {
interviewPartner = new InterviewPartner();
deliveryPartner = new DeliveryPartner();

deliveryPartners = new ArrayList<DeliveryPartner>();
deliveryBikes = new ArrayList<DeliveryBike>();

}

@Override
public void onReceive(Context context, Intent intent) {
setReportOfPartnerInServer();
}

private void setReportOfPartnerInServer() {
//make object in interviewpartner
makeJsonObjectsToSend(deliveryPartner);
//request
deliveryPartner.jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,
"http://192.168.43.206/project-server/Request.php?action=ReportDeliveryLocation",
deliveryPartner.jsonObject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
System.out.println("Response:" + response);
try {
actionType = ActionType.REPORT_LOCATION;
responseListener.onSuccesResponse(response);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("Response:" + error);
actionType = ActionType.REPORT_LOCATION;
responseListener.onErrorResponse(error);
}
});
requestTimeOut(deliveryPartner.jsonObjectRequest);
G.getInstance().addToRequestQueue(deliveryPartner. jsonObjectRequest);
}




این کدها هم در کلاس apimanager هست که از braodcastreciver ارث بری میکنه و میگه که یه تابع رو باید در onrecieve () اجرا کنه ...
مسئله اینجاست که اصلا در onrecieve نمیره
من رو از راهنمایی خودتون دریغ نفرمایید دوستان عزیز ...متشکرم

CodeforLife
شنبه 21 اسفند 1395, 07:25 صبح
سلام
باید در مانیفست این کد رو اضافه می کردم ..

<receiver
android:name="com.example.parisa.deliverybikeproject.Activities. Model.ApiManager"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.NOTIFY" />
</intent-filter>
</receiver>

لی حالا یه مسئله ای هست که وقتی میره تو recieve همه پراپر تی ها رو نال میکنه ...:(

CodeforLife
شنبه 21 اسفند 1395, 09:25 صبح
سلام دوستان
من در یه فرگمنت که موقعیت جغرافیایی رو میگیره (البته گرفتن موقعیت جغرافیایی در یک کلاس دیگه هست که در فرگمنت کال می کنمش ) اومدم گفتم زمانیکه lat , lng رو گرفتی , برو یه کلاس به نامdeliverypartner رو مقدار دهی کن و بعد از یه ثانیه برو تو کلاس apimanager که علاوه بر انجام دادن همه درخواست ها به سرور ...میاد یه متد onrecieve () هم میگیره که داده ها یی رو که در deliverypartner داره باید ببره سمت سرور آپدیت کنه !!! در سمت سرور مقدار دهی میکنم و مقدار دهی هم میشه ولی وقتی میره تو recieve همه getter /setter های مربوط به کلاس deliverypartner که پر بود خالی میشه حتی listener هم نال میشه ...لطفا راهنمایی کنید از چی میتونه باشه ... چه حدسی می زنید ...
کدای مربوط به فرگمنت :

public class MapFragment extends Fragment implements LocationSource.OnLocationChangedListener, ApiManager.onResponseListener {
private MapView mapView;
private GoogleMap googleMap;
private LatLng latLng = new LatLng(0.0, 0.0);
private View view;
private GPSLocation gpsLocation;
private double latitude, longitude;
private TextView txtSourceAddress;
private GoogleApiReader googleApiReader;
private ProgressBar progressLoadData;
private ImageView imgMarker;
private LinearLayout progressLayout;
private Thread thread;
private boolean FirstLevel = true;
private ApiManager apiManager = new ApiManager();


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.map_fragment, container, false);//inflate and return layout
init();//init controls
showAndHideImageFlag(false);//gone flag
mapView.onCreate(savedInstanceState);
mapView.onResume();// needed to get the map to display immediately
try {
MapsInitializer.initialize(getActivity().getApplic ationContext());//init map, get activity
} catch (Exception e) {
e.printStackTrace();
}
googleMap = mapView.getMap();//set googlemap with map view contain
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap map) {
googleMap = map;
googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
if (FirstLevel) {//first get current location
//show current location in this moment on map
gpsLocation = new GPSLocation(getContext(), getActivity());
if (gpsLocation.canGetLocation()) {
latitude = gpsLocation.getLatitude();
longitude = gpsLocation.getLongitude();
onLocationChanged(gpsLocation.getLocation());
convertLatLngToAddress();
//alarm manager work, get lat/lng,get date/time,fire recieve method
workingAlaramManager();
FirstLevel = false;
}
} else {//camera location
showHidePrograssbar(true);
showAndHideLayout(true);
showAndHideImageFlag(false);
txtSourceAddress.setText(R.string.get_info_progres s);
getLatLngFromCameraMoving();//get camera lat lng
convertLatLngToAddress();//convert camera got latlng to address
}
}
});
}
});
return view;
}

//Alarm Manager work
private void workingAlaramManager() {
apiManager.deliveryPartner.setDeliveryLatitude(lat itude);//get latitude
apiManager.deliveryPartner.setDeliveryLongitude(lo ngitude);//get longitude
apiManager.deliveryPartner.dateTime();//get date time *i dont need address yet*
//
//enable onRecieve method in broadcast reciever to report and get action in listener
//
apiManager.setResponseListener(this);
Intent intent = new Intent(G.context, ApiManager.class);
//get intent extras
PendingIntent pendingIntent = PendingIntent.getBroadcast(G.context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) G.context.getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000, 1000, pendingIntent);
}

دهای مربوط به کلاس api manager


public class ApiManager extends BroadcastReceiver {
public ApiManager() {
interviewPartner = new InterviewPartner();
deliveryPartner = new DeliveryPartner();
deliveryPartners = new ArrayList<DeliveryPartner>();
deliveryBikes = new ArrayList<DeliveryBike>();
}
public ApiManager(Activity context) {
this.context = context;
interviewPartner = new InterviewPartner();
deliveryPartner = new DeliveryPartner();
responseListener = (onResponseListener) context;

deliveryPartners = new ArrayList<DeliveryPartner>();
deliveryBikes = new ArrayList<DeliveryBike>();
}
private Context context;
public InterviewPartner interviewPartner;
public DeliveryPartner deliveryPartner;
private onResponseListener responseListener;
private ActionType actionType;
private ArrayList<DeliveryPartner> deliveryPartners;
private ArrayList<DeliveryBike> deliveryBikes;

@Override
public void onReceive(Context context, Intent intent) {
setReportOfPartnerInServer();
}
private void setReportOfPartnerInServer() {
//make object in interviewpartner
makeJsonObjectsToSend(deliveryPartner);
//request
deliveryPartner.jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,
"http://192.168.43.206/project-server/Request.php?action=ReportDeliveryLocation",
deliveryPartner.jsonObject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
System.out.println("Response:" + response);
try {
actionType = ActionType.REPORT_LOCATION;
responseListener.onSuccesResponse(response);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("Response:" + error);
actionType = ActionType.REPORT_LOCATION;
responseListener.onErrorResponse(error);
}
});
requestTimeOut(deliveryPartner.jsonObjectRequest);
G.getInstance().addToRequestQueue(deliveryPartner. jsonObjectRequest);
}

دارم دیوونه همیشم ....:(
چرا نال میشه....؟؟؟