绑定服务和线程之间的区别

时间:2017-04-10 08:40:29

标签: android

我正在学习Android服务,因为我听说这是执行后台任务的android建议。

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

问题是:为什么我应该使用IBinder界面使自己复杂化并通过此回调调用我的方法see official docs

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

什么时候我可以简单地创建自定义服务?例如,如果我想在一个Activity中播放一些背景音乐,我可以创建这个自定义(和简单)服务:

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

1 个答案:

答案 0 :(得分:0)

您可以根据需要创建线程和其他对象。但是您的解决方案有一个大问题 - Android操作系统不了解您的"服务"。请记住,android可以随时终止您的应用程序进程。假设你的活动进入后台,从android os的角度来看,你的应用程序进程是一个很好的杀戮候选者 - 它只有一个不活跃的活动。

将服务视为对操作系统的通知,即您的应用在后台执行重要操作。

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

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