我正在学习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();
}
}
答案 0 :(得分:0)
您可以根据需要创建线程和其他对象。但是您的解决方案有一个大问题 - Android操作系统不了解您的"服务"。请记住,android可以随时终止您的应用程序进程。假设你的活动进入后台,从android os的角度来看,你的应用程序进程是一个很好的杀戮候选者 - 它只有一个不活跃的活动。
将服务视为对操作系统的通知,即您的应用在后台执行重要操作。
另一方面,如果只有您的活动处于活动状态,您的后台工作才会发生,您不需要服务。为了避免混淆,请不要在不是真正的android服务的类中使用名称服务。
编辑:还要注意,您可以手动启动服务,然后再绑定到服务。如果您已手动启动绑定服务,则它将继续运行,直到您停止它为止。