Android中Serivce初探

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里面启动子线程的方式

 

  1. public int onStartCommand(Intent intent, int flags, int startId) {  
  2.     new Thread(new Runnable() {  
  3.         @Override  
  4.         public void run() {  
  5.             // 开始执行后台任务  
  6.         }  
  7.     }).start();  
  8.     return super.onStartCommand(intent, flags, startId);  
  9. }  
  10.   
  11. class MyBinder extends Binder {  
  12.   
  13.     public void startDownload() {  
  14.         new Thread(new Runnable() {  
  15.             @Override  
  16.             public void run() {  
  17.                 // 执行具体的下载任务  
  18.             }  
  19.         }).start();  
  20.     }  
  21.   
  22. }  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。