首先来讲一下什么是服务:服务是安卓四大组件之一,与activity一样,代表可执行的程序。服务是没有界面的,一直在后台运行。作用呢就是:1、和广播类一起使用,开机启动服务监听系统的所有通讯。2、在后台播放音乐。3、木马程序。。。。。。
服务可分为本地服务(启动服务),远程服务(绑定服务)两种。先来讲一下本地服务吧!
一个本地服务可以被开启多次,但只会被创建一次,销毁也只会执行 一次。他的生命周期为:开始:startService(Intent intent); 结束:1,stopService(Intent intent); 2,stopSelf();表示不管用了多少次startService(),都会停止服务,并且只会停止第一个,不管你开启了多少个服务它都是同时执行的 3、stopSelf(int startId)。会等所有的startService都停止的时候才会停止。其服务执行的顺序是有序的,也就是执行了一个再执行下一个。
如何创建本地服务:
写一个类继承Service类,然后重写其中的几个生命周期的方法。
onBind(Intent intent) 只在调用bindService方法启动服务的时候才会执行。代码如下:
xml:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动服务"
android:onClick="openservice"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止服务"
android:onClick="stopservice"
/>
activity:
package com.example.an_services;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
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,Myservice.class);
}
//启动
public void openservice(View view){
intent.putExtra("data","下载的路径");
startService(intent);
}
//停止
public void stopservice(View view){
stopService(intent);
}
}
服务activity:
package com.example.an_services;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.util.Log;
/**
* Created by Administrator on 2017/2/12.
*/
public class Myservice extends Service{
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("test","onBind");
return null;
}
@Override
public void onCreate() {
Log.i("test","onCreate");
super.onCreate();
}
//ANR 错误 application not responsing
//reason:耗时操作写到了主线程
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String data=intent.getStringExtra("data");
Log.i("test","onStartCommand"+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);
}
}
@Override
public void onDestroy() {
Log.i("test"," onDestroy");
super.onDestroy();
}
}
服务2activity:
package com.example.an_services;
import android.app.IntentService;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;
/**
* Created by Administrator on 2017/2/12.
*/
public class Myservices2 extends IntentService{
public Myservices2(){
super("");
}
public Myservices2(String name) {
super(name);
}
//类似service中的:onStartCommand
//可以直接写耗时操作 因为里面有异步任务类 执行有前后关系 而service没有
@Override
protected void onHandleIntent(Intent intent) {
for (int i = 0; i <10 ; i++) {
Log.i("test","i="+i);
SystemClock.sleep(200);
}
}
}
注意:service耗时操作不能写在主线程里,需开辟一个子线程。而IntentService可以在主线程写耗时操作,因为里面有异步任务类 执行有前后关系 而service没有