Android中的Service有两种启动方式
1,startSverice
2,bindService
这两种启动Service的方式略有不同。
首先看startService
Intent startIntent = new Intent(MainActivity.this,MyService.class);
startService(startIntent);
启动的方式基本是和启动一个Activity是一样的。都是通过Intent。接下来看一个Service的一般构造方式。
onCreate() -> onStartCommand() -> onDestory()
这是一般情况的重要几种方法。
和Activity类似,在一个Service的生命周期。,onCreate()都是只调用一次的。然后onStarcommand()方法,startService几次,就会调用几次的
接下来看bindService
bindService稍微复杂一点。不过理清楚就好了。
启动方式 :
Intent bindIntent = new Intent(MainActivity.this,MyService.class);
bindService(bindIntent, connection,BIND_AUTO_CREATE);
一样是通过Intent启动,然后进行服务的绑定,其实就是在具体指定绑定哪一个服务了。
bindService的三个参数:启动哪个Service,connection 我个人的理解就是启动service以后返回的连接什么的,第三个参数是启动了Service自动调用create(0方法
用这种方式启动Service的话,需要实现onBind()方法,返回一个绑定的内容。随后这个内容传递给onServiceConnected方法里,获得这个内容。调用绑定方法中的方法。
写的不是很清晰。
销毁Service
如果同时startService以及bindService的话。那么需要stopService和unBindService
线程和Service。
一个Activity启动的Service 两个的线程ID是相同的。
那么这样会有ANR主线程阻塞吗?
不会。 用Service的好处就是即使主线程被KILL了。这个Service还是存在的。即使activity已经被finishi()。也没有关闭Service。
遇到一个问题,当绑定好Service以后,关闭了Activity,再取消绑定,会报错,找不到取消的Service。这个意思应该是。
一个Activity重新启动后,没有记得之前绑定的Service,然后取消绑定的Service,所以就Null了。
用Service的好处。
因为Service不会因为Activity的关闭而关闭,因此如果activity被finish后,也可以重新绑定Service来获得相应的内容。
那么为什么不在Activity里直接启动一个线程来进行操作呢。因为finishi以后,这个线程就控制不了了。并且其他的activity也访问不到这个线程的。
在service里就可以哦
那么看一下service里面启动子线程的方式
- public int onStartCommand(Intent intent, int flags, int startId) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- // 开始执行后台任务
- }
- }).start();
- return super.onStartCommand(intent, flags, startId);
- }
- class MyBinder extends Binder {
- public void startDownload() {
- new Thread(new Runnable() {
- @Override
- public void run() {
- // 执行具体的下载任务
- }
- }).start();
- }
- }