在Android中停止服务


79

在这里,我尝试了简单的服务程序。启动服务可以正常工作并生成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();
    }
}

调用此服务的活动的代码如下:

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()方法中生成吐司。我已经在这里看到了很多有关停止服务问题的帖子,但并不令人满意,因此发布了新问题。希望得到满意的答复。


6
难道stopService(serviceIntent)不行?
克里斯·卡什韦尔

“此外,请记住,服务被销毁的确切时间取决于Android,并且可能不是即时的。” 来源:stackoverflow.com/questions/2176375/android-service-wont-stop/...
bigstones

1
@chris:我认为上述实现的stopService(serviceIntent)方法无法正常工作,因为在停止按钮单击时不会发生onDestroy()的Toast。
拉维·巴特

@bigstone:这是否意味着我的stopService()和onDestroy()方法可以正常工作,但在按停止按钮时不能立即工作?
拉维·巴特

@Ravi:是的。Android可能会决定是否有足够的资源将服务保留在内存中,以便在再次需要时将其准备就绪。
bigstones 2011年

Answers:


49
onDestroyed()

是错误的名字

onDestroy()  

您是否仅在此问题或代码中犯了错误?


是的,后来我从头开始编写代码,效果很好。是的,可能是我之前的代码中的那个问题,其他我也没有注意到。任何方式谢谢:)因为它也对其他人有帮助。
拉维·巴特

2
@RaviBhatt那么您成功停止了服务吗?如果是,那么您可以分享如何做吗?
suraj 2012年


3
@suraj如果您引用我的代码比需要做的事多,请在Activity中添加一个意图,intent = new Intent(ServiceTest.this,MailService.class) 并使用相同的意图来启动和停止服务,例如startService(intent)和stopService(intent)。
拉维·巴特

11
这就是为什么您应该始终使用@Override注释的原因。
帕维尔

16

该代码对我有用:检查此链接
这是我在活动中停止和启动服务时的代码

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

14

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

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

然后将onDestroy()服务中的方法称为:

  @Override
    public void onDestroy() {

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.