2013-11-14 80 views
0

我試圖將用戶在活動類中選擇的值移動到服務類,以便服務運行那麼久。我知道我必須從微調器中獲取選定的值,將數學運算轉換爲幾分鐘,然後將該值傳遞給服務。它只是沒有爲我這樣做,我無法弄清楚爲什麼。我知道我不能將字符串值作爲int值傳遞,但是當我嘗試使值爲int時,它會給出語法錯誤以將其更改回字符串。將微調值從活動移動到服務android

活動

private static final String TAG = "ShipService"; 
public static final Integer[] TIME_IN_MINUTES = { 30, 45, 60, 180, 360 }; 
public MediaPlayer mediaPlayer; 
public Handler handler = new Handler(); 
public Button button2; 
public Button stop1; 
public Spinner spinner2; 

// Initialize the activity 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.ship); 
    button2 = (Button) findViewById(R.id.btn2); 
    button2.setOnClickListener(this); 
    stop1 = (Button) findViewById(R.id.stop); 
    stop1.setOnClickListener(this); 
    spinner2 = (Spinner) findViewById(R.id.spinner2); 
    ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(this, 
    android.R.layout.simple_spinner_item, TIME_IN_MINUTES); 

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner2.setAdapter(adapter); 
    int getTime = TIME_IN_MINUTES[spinner2.getSelectedItemPosition()]; 
    long time = (getTime * 60000);***Gives error here*** 
    Intent intService = new Intent(Ship.this, Shipservice.class);***Gives 
      error here*** 
     intService.hasExtra(time);***Gives error here*** 



} 

// Handle button callback 
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.btn2: 
     Log.d(TAG, "onClick: starting service"); 
     startService(intService);***Gives error here*** 

     break; 
    case R.id.stop: 
     Log.d(TAG, "onClick: stopping srvice"); 
     stopService(intService);***Gives error here*** 
     break; 
    } 
} 
} 

服務

public class Shipservice extends Service { 
private static final String TAG = "Shipservice"; 
MediaPlayer myPlayer; 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 

    myPlayer = MediaPlayer.create(this, R.raw.ocean_ship); 
    myPlayer.setLooping(false); // Set looping 
} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "Ship Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 
    myPlayer.stop(); 
} 

@Override 
public void onStart(Intent intent, int startid) { 
    long time = 0; 
    if (intent.hasExtra(time)) { 
     time = intent.getLongExtra(time); 
    } 
    Toast.makeText(this, "Ship Service Started for" + time, 
Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 
    myPlayer.start(); 
} 
} 
+0

你可以請張貼您的stacktrace以獲得更好的支持 – Subbu

+0

我無法使用當前存在的錯誤生成項目 – user2980560

+0

分享您所看到的錯誤 – Subbu

回答

0

我認爲你必須在你的程序邏輯上的缺陷。您正在獲取微調器的選定位置並在onCreate中創建Intent,您應該在onClick中執行此操作,以便傳入的值是用戶在單擊該按鈕時選擇的內容。

此外,您正在使用「hasExtra」而不是「putExtra」。 hasExtra只會檢查是否多出來並返回一個布爾值。 putExtra在下一個intent開始時放入一個額外的內容。

@Override 
public void onClick(View v) { 

    int getTime = TIME_IN_MINUTES[spinner2.getSelectedItemPosition()]; 
    long time = (getTime * 60000); 
    Intent intService = new Intent(Ship.this, Shipservice.class); 
    intService.putExtra("timeToRun", time); //putExtra instead of "hasExtra" 

    switch (v.getId()) { 
    case R.id.btn2: 
     Log.d(TAG, "onClick: starting service"); 
     startService(intService); 

     break; 
    case R.id.stop: 
     Log.d(TAG, "onClick: stopping srvice"); 
     stopService(intService); 
     break; 
    } 
} 

此外,當你傳遞額外信息時,你需要指定一個你放入它的鍵。我稱它爲「timeToRun」。你會得到它與「intent.getLongExtra(」timeToRun「);你不能只是放在沒有一個關鍵的價值,因爲意圖不會知道如何檢索它http://developer.android.com/reference/android/content/Intent.html

+0

非常感謝您的幫助。在服務類中,我需要將if語句更改爲什麼? – user2980560

+0

您使用th與插入值相同的密鑰。附加功能只是一個關鍵的值對,可以傳遞給新的Intent。 –

+0

所以在這種情況下,TORun是應該放在服務中的關鍵嗎? – user2980560