停止Android中的服务

88

我尝试了一个简单的服务程序。开始服务可以正常工作并生成Toast,但是停止服务不行。该简单服务的代码如下:

public class MailService extends Service {
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    public void onCreate(){
        super.onCreate();
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
    }
    public void onDestroyed(){
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_SHORT).show();
        super.onDestroy();
    }
}

调用此服务的 Activity 的代码如下:

public class ServiceTest extends Activity{
    private Button start,stop;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.service_test);

        start=(Button)findViewById(R.id.btnStart);
        stop=(Button)findViewById(R.id.btnStop);

        start.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                startService(new Intent(ServiceTest.this,MailService.class));
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                stopService(new Intent(ServiceTest.this,MailService.class));
            }
        });
    }
}

请帮助我停止服务,使用那个在onDestroy()方法中生成toast的停止按钮。我已经看过许多关于停止服务问题的帖子,但并不令人满意,所以发布了新问题。希望得到令人满意的答案。


6
stopService(serviceIntent)无效吗? - Chris Cashwell
另外,请记住,服务被销毁的确切时间取决于Android,并且可能不会立即发生。 - bigstones
1
@chris:我认为stopService(serviceIntent)方法并没有像我上面实现的那样工作,因为在停止按钮点击时,onDestroy()中的Toast没有出现。 - Ravi Bhatt
1
@bigstone:这是否意味着我的stopService()和onDestroy()方法在我按下停止按钮时不会立即起作用,但它们确实正常工作? - Ravi Bhatt
@Ravi:是的。Android可能会决定有足够的资源来保持服务在内存中,以便在需要时可以立即使用。 - bigstones
@bigstone:好的,现在我对服务有了一些想法。谢谢。 - Ravi Bhatt
3个回答

53
onDestroyed()

这是错误的名称

onDestroy()  

你只在这个问题中犯了错误,还是在你的代码中也出现了错误?


后来我从头开始编写代码,它运行得很好。也许在我之前的代码中有这个问题,其他人和我也没有注意到。无论如何,谢谢 :) 这也对其他人有帮助。 - Ravi Bhatt
2
@RaviBhatt,你现在能停止一个服务了吗?如果可以的话,你可以分享一下如何做吗? - suraj
@suraj 文档怎么样? - k4dima
4
如果你参考了我的代码,那么你需要做的是,在Activity中创建一个意图(Intent),像这样:intent = new Intent(ServiceTest.this,MailService.class),然后在启动服务和停止服务时都使用同一个意图,例如startService(intent)和stopService(intent)。 - Ravi Bhatt
13
所以你应该始终使用@Override注解。 - Pavel
@RaviBhatt 这非常有用!谢谢! - Martin Pfeffer

24

这段代码对我有用:请查看链接
这是我在活动中停止和启动服务的代码

case R.id.buttonStart:
  Log.d(TAG, "onClick: starting srvice");
  startService(new Intent(this, MyService.class));
  break;
case R.id.buttonStop:
  Log.d(TAG, "onClick: stopping srvice");
  stopService(new Intent(this, MyService.class));
  break;
}
}
 }

在服务类中:

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

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

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

开心编程!


在服务内部发生异常时如何处理?我怀疑onDestory()是否会被调用。 - Srihari Karanth

18

停止服务,我们必须使用方法stopService()

  Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class);
  //startService(myService);
  stopService(myService);

然后在服务中调用了方法onDestroy()

  @Override
    public void onDestroy() {

        Log.i(TAG, "onCreate() , service stopped...");
    }

这里有一个完整的示例,包括如何停止服务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接