【问题标题】:How to call stopservice() method of Service class from the calling activity class如何从调用活动类调用Service类的stopservice()方法
【发布时间】:2010-07-02 11:14:04
【问题描述】:

我正在尝试从我的活动中调用我的服务类的 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);

    }


}

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

【问题讨论】:

标签: android


【解决方案1】:

事实上要停止服务,我们必须使用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,包括如何启动/停止服务。

【讨论】:

    【解决方案2】:

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

    <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 是否被正确调用。

    【讨论】:

    【解决方案3】:

    @Juri

    如果你为你的服务添加 IntentFilters,你是说你想将你的服务暴露给其他应用程序,那么它可能会被其他应用程序意外停止。

    【讨论】:

      【解决方案4】:

      当您取消选中该复选框时,它似乎应该停止服务。日志中有异常吗? stopService 返回一个布尔值,指示它是否能够停止服务。

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

      自动服务

      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);
          }
      
      }
      

      【讨论】:

        【解决方案5】:

        在 Kotlin 中你可以做到这一点...

        服务:

        class MyService : Service() {
            init {
                instance = this
            }
        
            companion object {
                lateinit var instance: MyService
        
                fun terminateService() {
                    instance.stopSelf()
                }
            }
        }
        

        在您的活动中(或在您的应用中的任何地方):

        btn_terminate_service.setOnClickListener {
            MyService.terminateService()
        }
        

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

        【讨论】:

          猜你喜欢
          • 2016-12-11
          • 1970-01-01
          • 2014-06-28
          • 2020-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多