2013-10-15 49 views
0

我已经使这项服务能够播放声音,我可以通过我创建的方式脱离基础,因为我遵循的是一个简单的教程,它甚至不像我尝试做的那样。无论如何,我已经设置了我的主要活动,点击按钮时应启动此服务。该服务在构建中有错误,我无法运行它。在onCreate();它在SetContentView和FindViewById行有错误。我想知道为什么会发生这种情况,如果这是使用服务播放声音的正确方法,那么屏幕将不会超时。安卓服务没有定义布局

import android.app.Service; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.IBinder; 
import android.os.PowerManager; 
import android.util.Log; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 

public class Shipservice extends Service implements View.OnClickListener { 
public static final Integer[] TIME_IN_MINUTES = { 30, 45, 60, 180, 360 }; 
public MediaPlayer mediaPlayer; 
public Handler handler = new Handler(); 
public Button button2; 
public Spinner spinner2; 
public PowerManager.WakeLock wl; 
static final String TAG=Shipservice.class.getSimpleName(); 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
    // TODO Auto-generated method stub 

} 

public void onCreate(Bundle savedInstanceState) { 
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); 
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "wake"); 

    super.onCreate(); 
    wl.acquire(); 
    setContentView(R.layout.ship); 
    button2 = (Button) findViewById(R.id.btn2); 
    button2.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); 
    Log.d(TAG, "onCreate'd"); 
} 
// Play the sound and start the timer 
private void playSound(int resourceId) { 
    // Cleanup any previous sound files 
    cleanup(); 
    // Create a new media player instance and start it 

    mediaPlayer = MediaPlayer.create(this, resourceId); 
    mediaPlayer.start(); 
    // Create the timer to stop the sound after x number of milliseconds 
    int selectedTime = TIME_IN_MINUTES[spinner2.getSelectedItemPosition()]; 
    handler.postDelayed(runnable, selectedTime * 60 * 1000); 
} 

// Handle button callback 
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.btn2: 
     playSound(R.raw.ocean_ship); 
     break; 
    } 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    cleanup(); 
    super.onDestroy(); 
    Log.d(TAG, "onDestroy'd"); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    // TODO Auto-generated method stub 
    super.onStart(intent, startId); 
    Log.d(TAG, "onStart'd"); 
} 

public void cleanup() { 
    if (mediaPlayer != null) { 
     mediaPlayer.stop(); 
     mediaPlayer.release(); 
     mediaPlayer = null; 

    } 
    // Cancel any previously running tasks 
    handler.removeCallbacks(runnable); 
} 

// Runnable task used by the handler to stop the sound 
public Runnable runnable = new Runnable() { 
    public void run() { 
     cleanup(); 
    } 
}; 


protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    wl.release(); 
} 

} 
+0

你能告诉我们错误发生的地方吗?期望人们开始一个项目并将代码复制到其中,以便看到你在说什么是不合理的, – Codeman

+0

想到问你什么是错误。请编辑您的文章并添加您的错误。 – prijupaul

+0

你可以夸大服务的布局吗?据我所知服务没有任何用户界面..只有活动有一个用户界面,你可以在onCreate() –

回答

0

服务没有用户界面!创建活动与用户进行交互,并将它通过startService(意向)将请求转发到服务


针对在评论的问题:

创建一个从IntentService派生新类。 在该类中,实现onHandleIntent(意图intent)方法。 在Manifest文件中添加新服务的声明。

在您的应用程序中: 当用户采取可引起声音播放的操作时: 创建一个明确引用您的新服务的Intent。 添加额外的信息意图告诉服务该做什么 (你也可以使用意图的动作字段为此) 调用startService(intent)方法将意图发送到服务。

哪些功能应该移动到服务中,我会留给你的。基本上任何需要超过几毫秒的任何应该在服务中。

有很多可用的例子。谷歌像IntentService这样的播放声音来找到它们。

+0

setContentView(布局)这将解释在设置的内容视图的错误。所以基本上我有一个播放声音的活动,并且有一个UI,但是我被告知我需要一个服务来处理声音播放。我应该如何分割? – user2869238