在android中停止服务

Posted

技术标签:

【中文标题】在android中停止服务【英文标题】:stop service in android 【发布时间】:2021-08-14 10:57:46 【问题描述】:

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

调用该Service的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 的停止按钮帮助我停止服务。我已经在这里看到了很多关于停止服务问题的帖子,但并不令人满意,所以发布了新问题。希望得到满意的答复。

【问题讨论】:

stopService(serviceIntent) 不起作用吗? “另外,请记住,服务被销毁的确切时间取决于 android,可能不会立即生效。” 来自:***.com/questions/2176375/android-service-wont-stop/… @chris : 我认为我在上面实现的 stopService(serviceIntent) 方法不起作用,因为 onDestroy() 的 Toast 在停止按钮单击时没有发生。 @bigstone:这是否意味着我的 stopService() 和 onDestroy() 方法正常工作,但当我按下停止按钮时不能立即工作? @Ravi:是的。 Android 可能会决定有足够的资源将服务保留在内存中,以便在再次需要时准备好。 【参考方案1】:
onDestroyed()

是错误的名字

onDestroy()  

您是只在这个问题上犯了错误,还是在您的代码中也犯了错误?

【讨论】:

是的,后来我从头开始编写代码,它运行良好。任何是的,可能是我早期代码中的那个问题,其他我也没有注意到。无论如何谢谢:)因为它也对其他人有帮助。 @RaviBhatt 那么您成功停止服务了吗?如果是,那你能分享一下怎么做吗? @suraj what about docs? @suraj 如果您参考了我的代码而不是您需要做的,请在 Activity 中创建一个意图,如 intent = new Intent(ServiceTest.this,MailService.class) 并使用相同的意图来启动和停止服务,如 startService(intent) 和停止服务(意图)。 这就是为什么你应该总是使用@Override注解。【参考方案2】:

此代码适用于我:检查此link 这是我在活动中停止和启动服务时的代码

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() 是否会被调用。【参考方案3】:

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

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

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

  @Override
    public void onDestroy() 

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

这是一个complete example,包括如何停止服务。

【讨论】:

以上是关于在android中停止服务的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中停止重复警报服务?

Android:在另一个活动中停止服务

Android:停止服务

Kivy:从主应用程序停止 android 服务

Android Activity 不会停止服务和位置更新

Android 服务在推送通知发送时启动并在服务任务完成后停止