Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 108,130

HOME > Mobile > Mobile Forum > [Android] เรื่องการแชร์ตัวแปรระหว่าง Activity กับ Sevice



 

[Android] เรื่องการแชร์ตัวแปรระหว่าง Activity กับ Sevice

 



Topic : 089700

Guest




เกริ่นก่อนนะครับ
คือผมต้องการทำแอพตรวจสอบระยะห่างระหว่างจุดสองจุด โดยทำการเช็คทุกๆ 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







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2013-01-24 10:16:27 By : นักพัฒนามือใหม่ View : 1537 Reply : 2
 

 

No. 1



โพสกระทู้ ( 74,054 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

น่าจะผ่าน 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
 


 

No. 2

Guest


ตอบความคิดเห็นที่ : 1 เขียนโดย : mr.win เมื่อวันที่ 2013-01-24 13:49:05
รายละเอียดของการตอบ ::
ขอบคุณครับ
ผมใช้ Intent แล้วครับ โดยให้มีการเซฟค่าที่ ("key", ITEM) โดยให้ ITEM มีค่าเป็น 1 หรือ 2
ถ้าผู้ใช้ออกนอกบริเวณ แล้วมีการเตือนครั้งแรก ITEM มีค่าเป็น 1
ถ้าผู้ใช้อยู่ในบริเวณ ITEM มีค่าเป็น 2
กำหนดเพื่อให้มันเตือนเพียงครั้งแรก
ถ้าไม่กำหนดเงื่อนไข มันจะเตือน ทุก 10 วิที่ออกนอกบริเวณ
ทั้งหมดนี้เป็นการ intent กลับ class เดิม(Intent intent = new Intent(servicetrack.this,servicetrack.class);)

และมีการควบคุมการตรวจสอบตำแหน่ง ทุก 10 วิ ในActicity เรียกไปที่ servicetrack.this
ตรงนี้แหละครับที่ไม่ได้มีการ intent ค่า "key" ไป เพราะค่านี้จะเกิดเฉพาะ servicetrack.this

ตอนนี้ผมไปหาข้อมูลมา น่าจะใช้ getSharedPreference ผมก็ไม่รู้ว่ามันคืออะไร ผมไปลองก่อนนะครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-01-25 15:52:29 By : นักพัฒนามือใหม่
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : [Android] เรื่องการแชร์ตัวแปรระหว่าง Activity กับ Sevice
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: Voake, Comcube, รับทำเว็บไซต์ รับเขียนโปรแกรม , รับทำบัญชี , โรงงานผลิตครีม

Load balance : Server 01
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2020 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 , 08-9968-0655 อัตราราคา คลิกที่นี่