如何从调用活动类调用Service类的stopservice()方法

时间:2010-07-02 11:14:04

标签: android

我正试图从我的活动中调用我的服务类的stopService()方法。 但我不知道如何从我的活动类访问stopservice方法。 我有以下代码,但它不工作...........

  

这是HomeScreen类:

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

        enablecheck = (CheckBox)findViewById(R.id.enablecheck);            

        enablecheck.setOnCheckedChangeListener(new OnCheckedChangeListener()
        {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if(enablecheck.isChecked()){    
                    startService(new Intent(HomeScreen.this, AutoService.class));
                }else
                {
                    stopService(new Intent(HomeScreen.this, AutoService.class));

                }                       
            }

        });

    }
This is Service Class:
public class AutoService extends Service {

    private static final String TAG = "AutoService";
    private Timer timer;    
    private TimerTask task;

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

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

        int delay = 5000; // delay for 5 sec.
        int period = 5000; // repeat every sec.

        timer = new Timer();

        timer.scheduleAtFixedRate(task = new TimerTask(){
            public void run() 
            {
                System.out.println("done");
            }   
        }, delay, period);


    }


    @Override
    public boolean stopService(Intent name) {
        // TODO Auto-generated method stub
        timer.cancel();
        task.cancel();
        return super.stopService(name);

    }


}

任何建议都非常值得赞赏。 感谢致敬 Mintu

5 个答案:

答案 0 :(得分:37)

事实上,为了停止服务,我们必须使用方法stopService()并且您正在以正确的方式进行:

开始服务:

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

停止服务:

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

如果您致电stopService(),则会调用服务中的方法 onDestroy() 不是stopService()方法):

  @Override
    public void onDestroy() {
      timer.cancel();
      task.cancel();    
        Log.i(TAG, "onCreate() , service stopped...");
    }

您必须实施onDestroy()方法!

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

答案 1 :(得分:34)

我实际上使用了与你相同的代码。我在清单中的服务注册如下

<service android:name=".service.MyService" android:enabled="true">
            <intent-filter android:label="@string/menuItemStartService" >
                <action android:name="it.unibz.bluedroid.bluetooth.service.MY_SERVICE"/>
            </intent-filter>
        </service>

在服务类中,我创建了一个相应的常量字符串,用于标识服务名称,如:

public class MyService extends ForeGroundService {
    public static final String MY_SERVICE = "it.unibz.bluedroid.bluetooth.service.MY_SERVICE";
   ...
}

从相应的Activity中我用

调用它
startService(new Intent(MyService.MY_SERVICE));

并用

停止
stopService(new Intent(MyService.MY_SERVICE));

完美无缺。尝试检查您的配置,如果您没有发现任何异常,请尝试调试您的stopService是否正确调用。

答案 2 :(得分:4)

当您取消选中该复选框时,它看起来应该停止服务。日志中是否有例外? stopService返回一个布尔值,表示它是否能够停止服务。

如果您是通过Intents启动服务,那么您可能希望扩展IntentService而不是服务。当没有更多工作要做时,该课程将自行停止服务。

<强>汽车维修中心

class AutoService extends IntentService {
     private static final String TAG = "AutoService";
     private Timer timer;    
     private TimerTask task;

     public onCreate() {
          timer = new Timer();
          timer = new TimerTask() {
            public void run() 
            {
                System.out.println("done");
            }
          }
     }

     protected void onHandleIntent(Intent i) {
        Log.d(TAG, "onHandleIntent");     

        int delay = 5000; // delay for 5 sec.
        int period = 5000; // repeat every sec.


        timer.scheduleAtFixedRate(timerTask, delay, period);
     }

     public boolean stopService(Intent name) {
        // TODO Auto-generated method stub
        timer.cancel();
        task.cancel();
        return super.stopService(name);
    }

}

答案 3 :(得分:4)

@Juri

如果您为服务添加IntentFilters,则表示您希望将服务公开给其他应用程序,然后其他应用程序可能会意外停止。

答案 4 :(得分:0)

在Kotlin中,您可以这样做...

服务:

class MyService : Service() {
    init {
        instance = this
    }

    companion object {
        lateinit var instance: MyService

        fun terminateService() {
            instance.stopSelf()
        }
    }
}

在您的活动中(或与此相关的应用程序中的任何地方):

btn_terminate_service.setOnClickListener {
    MyService.terminateService()
}

注意:如果您有任何待处理的意图在Android状态栏中显示通知,那么您可能也想终止该意图。