2017-04-10 46 views
0

我正在学习Android服务,因为我听说这是android推荐执行后台任务。绑定服务和线程之间的区别

我想与该服务进行交互,所以这就是我选择绑定服务的原因(顺便说一句,我不想​​无限期地运行该服务)。

的问题是:我为什么要复杂化使用的IBinder接口,并通过该回调see official docs

@Override public void onServiceConnected(ComponentName className, IBinder service){}

叫我的方法时,我可以简单地创建我的自定义服务自己?例如,如果我想在一个活动中播放背景音乐,我可以创建这个定制(简单)服务:

public class MyOwnService { 
    MediaPlayer mp; 
    MainActivity ma; 

    public MyOwnService(MainActivity mainActivity) { 
     mp = MediaPlayer.create(mainActivity, R.raw.badinerie); 
     ma = mainActivity; 
    } 

    public void play(){ 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       mp = MediaPlayer.create(ma, R.raw.badinerie); 
       mp.start(); 

      } 
     }).start(); 
    } 

    public void pause(){ 
     mp.pause(); 
    } 

    public void stop(){ 
     mp.stop(); 
     mp.release(); 
    } 
} 

,并打电话给我服务的最简单的方法是这样

public class MainActivity extends AppCompatActivity { 

    MyOwnService myOwnService; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     myOwnService = new MyOwnService(this); 
    } 

    public void play(View view) { 
     myOwnService.play(); 
    } 

    public void pause(View view) { 
     myOwnService.pause(); 
    } 

    public void stop(View view) { 
     myOwnService.stop(); 
    } 
} 
+0

您的服务不是服务。它只是一个名为“服务”的名字 –

+0

是的,但是做同样的事情 –

+0

它没有。尽管从您的角度看它可能看起来像这样,因为您不需要其他服务特定的功能 –

回答

0

您可以根据需要创建线程和其他对象。但是你的解决方案有一个大问题 - Android OS不知道你的“服务”。请记住,android可以随时终止您的应用程序进程。假设你的活动进入后台,从android的角度来看,你的应用程序是一个很好的杀人对象 - 它只有一个不活跃的活动。

想想服务就像通知os一样,你的应用程序在后台做了一些重要的事情。

另一方面,如果您的后台工作只应在您的活动处于活动状态时才会发生,则不需要服务。为了避免混淆,请不要在非真正的android服务的类中使用名称服务。

编辑:还请注意,您可以手动启动服务,然后再绑定到它。如果您已经手动启动绑定服务,那么它将继续运行,直到您停止它。

+0

*想想服务就像通知os一样,您的应用在后台**中做了一些重要的事情**。*我没有认为这是正确的,因为服务默认在主线程上运行 –

+0

服务在主线程中启动,但所有认真的工作都必须在后台线程中完成。 Android平台IntentService就是一个很好的例子。如果你的工作很小,以至于在主线程中可以安全地完成,那么我在使用服务时就没有多少看点。 – Okas

+0

*所有认真的工作必须在后台线程中完成*这是习惯性的,但没有必要。 * Android平台IntentService就是一个很好的例子*是的,但我们谈论服务是不是我们? *如果你的工作很小以至于可以在主线程中安全地完成,那么我在使用服务时看不到很多要点*关注的分离是在(服务)服务中放置甚至小任务的好参数 –

相关问题