[Android] เรื่องการแชร์ตัวแปรระหว่าง Activity กับ Sevice
เกริ่นก่อนนะครับ
คือผมต้องการทำแอพตรวจสอบระยะห่างระหว่างจุดสองจุด โดยทำการเช็คทุกๆ 10 วินาที่ โค้ดนี้
Code (Android-Java)
Intent intrack = new Intent(hatebug.this,trackservice.class);
intrack.putExtra("LT", lattointent); //lattointent คือ latitude ตำแหน่งเริ่ม
intrack.putExtra("LN", lontointent); //lontointent คือ longitude ตำแหน่งเริ่ม
PendingIntent tracklocal = PendingIntent.getService(hatebug.this, 0, intrack, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmtrack = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmtrack.setRepeating(AlarmManager.RTC_WAKEUP, calendartrack.getTimeInMillis(),10000, tracklocal);
จากนั้นในทุกๆ10 วินาที่ จะมีการแจ้งเตือนไปเรียก service ชื่อ trackservice.class ขึ้นมาทำงาน
โดย trackservice ทำหน้าที่ตรวจสอบตำแหน่ง และแจ้งเตือนด้วยการสั่น โค้ดนี้
Code (Android-Java)
public void onStart(Intent intent,int startId){
// TODO Auto-generated method stub
final float latserv = intent.getFloatExtra("LT", 0);
final float lonserv =intent.getFloatExtra("LN", 0);
final LocationManager locate = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
final LocationListener locationserv = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
// หาระยะห่าง d
String slat = String.valueOf(latserv);
String slon = String.valueOf(lonserv);
float lat = (float) location.getLatitude();
float lon = (float) location.getLongitude();
float dlat = (float) Math.toRadians(lat - latserv);
float dlon = (float) Math.toRadians(lon - lonserv);
float a1 = (float) ((Math.sin(dlat/2))*(Math.sin(dlat/2)));
float a2 = (float) ((Math.cos(Math.toRadians(lon)))*(Math.cos(Math.toRadians(100.546652)))*(Math.sin(dlon/2))*(Math.sin(dlon/2)));
float a = a1+a2;
float c = (float) (2*Math.atan2(Math.sqrt(a), Math.sqrt(1-a)));
float d = 6371000*c;
//ไม่มีอะไร เอาไว้ monitor
String f = String.valueOf(chkn);
String lool = String.format("Latitude\t\t: %1$s\nLongitude\t: %2$s\nDistance\t\t: %3$f\n%4$s\n%5$s\n%6$s",lat,lon,d,f,slat,slon);
Toast.makeText(getApplicationContext(), String.valueOf(chkn)+" "+String.valueOf(d), Toast.LENGTH_SHORT).show();
//เช็คว่า d มากกว่า 10 เมตรหรือไม่
if(d>10)
{
Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(1000);
}
}
จากนั้นผมต้องการให้มันสั่นแค่ครั้งแรกที่มีการตรวจสอบระยะว่าเกิน 10 เมตร ซึ่งผมได้ใช้ intent ใน service เพื่อตรวจสอบการสั่นครั้งแรก
โดยที่ใช้ตัวแปร chkn ในการเช็ค เมื่อสั่นครั้งแรกแล้ว กำหนดให้ chkn เป็น 1
Code (Android-Java)
final int chkn = intent.getIntExtra("CP", 2);// 2 คือค่าที่จะใช้ในchknเมื่อ"CP" ไม่มีค่าเก็บไว้
Code (Android-Java)
if(d>10)
{
if(chkn==2)
{
Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(1000);
Toast.makeText(getApplicationContext(), lool+"\n666", Toast.LENGTH_SHORT).show();
Intent chekin = new Intent(trackservice.this,trackservice.class);
chekin.putExtra("CP", 1);
chekin.putExtra("LT", latserv);
chekin.putExtra("LN", lonserv);
startService(chekin);
}
}
else if(d<10)
{
if(chkn==1)
{
Toast.makeText(getApplicationContext(), lool+"\n000", Toast.LENGTH_SHORT).show();
Intent chekin = new Intent(trackservice.this,trackservice.class);
chekin.putExtra("CP", 2);
chekin.putExtra("LT", latserv);
chekin.putExtra("LN", lonserv);
startService(chekin);
}
}
ปัญหาคือ ทุกๆ 10 วินาที alarmManager ทำงานเรียกเซอร์วิส ซึ่ง เมื่อออกนอก 10 เมตรมีการสั่นตลอด ทุก 10 วินาที
นั่นหมายความว่า การตรวจเช็คการสั่นครั้งแรกไม่ทำงาน และผมใช้ toast แสดงค่าดู พบว่า chkn = 2 ทุก 10 วินาที
เหมือนว่า ค่าใน "CP" ของผมไม่มีค่าถ้ามีการเรียก service จาก alarmManager
อยากทราบว่าจะมีแนวทางไหนนอกจาก Intent ที่สามารถแชร์ตัวแปรระหว่างกันใน Activity กับ Service ได้บ้างครับTag : Mobile, Android
Date :
2013-01-24 10:16:27
By :
นักพัฒนามือใหม่
View :
2029
Reply :
2
น่าจะผ่าน Intent น่ะครับ
Code (Android-Java)
Intent intent = new Intent(this, SecondActivity.class);
Bundle b = new Bundle();
// see Bundle.putInt, etc.
// Bundle.putSerializable for full Objects (careful there)
b.putXXXXX("key", ITEM);
intent.putExtras(b);
startActivity(intent);
// -- later, in Activity
Bundle b = this.getIntent().getExtras();
int i = b.getInt("key");
Date :
2013-01-24 13:49:05
By :
mr.win
Load balance : Server 01