我正试图从我的活动中调用我的服务类的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
答案 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状态栏中显示通知,那么您可能也想终止该意图。