服务是andriod四大组件之一,主要作用于执行耗时操作。与acticity一样代表可执行的程序。
但与acticity不同的是有用户操作的界面,服务是不可见的。
服务分为本地服务与远程服务,今天暂时讲的是本地服务。
本地服务有四个生命周期: 创建**onCreate(), 销毁onDestroy() , 绑定服务**onBind(只有在bindservices()才会调用此方法),onStartCommand(只有在启动服务的时候系统才会调用此方法 )。
services只能activity传值到services里
注意在清单文件里的配置是:
<service android:name=".MyServices" android:exported="true"/>
创建本地服务需要创建一个类继承services类然后重写里面的几个生命周期的方法代码如下:
public class MyServices extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("test","onBind");
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("test","onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("test","onDestroy");
}
}
需要注意的是不可在主线程里面执行耗时操作,可以使用子线程或者intentservices
intentservices是services的子类,可在主线程里面执行耗时操作并且内部有一个任务队列,并且会一次从任务队列中取出任务,然后调用onHandlerIntent()这个方法执行任务。当任务队列中的所有任务都完成以后才会停止服务。
如果自己手动停止服务,intent services会立即销毁但是它的工作线程不会立即退出。而是把当前正在执行的任务执行完毕才会停止服务,排队中未执行的任务将不再执行
intentservices还可进行传值到activity里,不像services只能是activity传值到services里
创建intent services与前面一样但是继承的是intentservices类代码如下:
但是需要注意的是必须要创建一个有参的构造函数和无参的构造函数
public class MyServices2 extends IntentService {
public MyServices2() {
super("");
}
public MyServices2(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
for (int i = 0; i <10 ; i++) {
Log.i("test","i="+i);
SystemClock.sleep(2000);
}
}
}
在activity里启动服务需要用到的方法是startservices(),关闭则用stopservices或者stopself() 这两者不同的是前者只能关闭手动停止服务,而后者是写到子线程里并且能在任务完成时自动停止服务。其中stop self有分为带参的和不带参的,不带参的是当第一个线程完成任务时就停止服务,带参的则会在所有线程都完成任务时才会停止服务
activity里的代码:
public class MainActivity extends AppCompatActivity {
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this,MyServices2.class);
}
public void start(View view){
intent.putExtra("data","下载的路径");
startService(intent);
}
public void stop(View view){
stopService(intent);
}
}
线程里的代码:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String data=intent.getStringExtra("data");
new MyThread(startId).start();
return super.onStartCommand(intent, flags, startId);
}
class MyThread extends Thread{
private int startId;
public MyThread(int startId) {
this.startId = startId;
}
@Override
public void run() {
super.run();
//耗时操作
for (int i = 0; i <10 ; i++) {
Log.i("test","i="+i);
SystemClock.sleep(1000);
}
//stopSelf();//当第一个线程执行完,就会停止服务
//所有的线程都执行完毕,才会停止服务
stopSelf(startId);
}
}