西部数码主机 | 阿里云主机| 虚拟主机 | 服务器 | 返回乐道官网

Android Service浅析

时间:2016-02-05 19:44来源:未知 作者:好模板 点击:
Service 需要在manifest.xml中注册,Service运行于主线程,和Thread没有任何关系,耗时操作需要再开线程 Service生命周期.png startService start 方式开启一个Service 创建Service Service 是一个抽象类,

Service 需要在manifest.xml中注册,Service运行于主线程,和Thread没有任何关系,耗时操作需要再开线程

 


Service生命周期.png

startService

start 方式开启一个Service

  • 创建Service
    Service 是一个抽象类,需要创建一个子类,并重新相关生命周期的方法
public class TestService extends Service {

public static final String TAG = "TestService";

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand");
    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy");  
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

}
  • 配置Service
<service android:name="com.speed.test.TestService"/>
  • 开启/关闭Service
Intent serviceIntent = new Intent(this, TestService.class);
startService(serviceIntent);
//stopService(serviceIntent);

调用了stop后Service会执行onDestory方法

  • onStartCommand()的返回值:
    在系统因资源不足时杀死这个service,之后以何种方式restart与这里的返回值有关
    START_NOT_STICKY:被杀后不会重启
    START_STICKY:会重启,除非系统有pending的intent,否则会丢给onstartCommand()一个null的intent。这适合于media player一类的service。
    START_REDELIVER_INTENT: 适合于下载等需要立即恢复的工作。

当启动一个Service的时候,会调用该Service中的onCreate()和onStartCommand()方法,当字词启动同一个Service是不会再次调用onCreate,而是直接调用onStartCommand

bindService

  • Service 中onBind返回一个Binder实例
private TestBinder mBinder = new TestBinder();
@Override 
public IBinder onBind(Intent intent) { return mBinder ;}

public class TestBinder extends Binder {
    public void show(){
        Log.d("bind service", "show");
    }
}
  • Activity中创建ServiceConnection进行教会
private ServiceConnection connection = new ServiceConnection() {  

    @Override  
    public void onServiceDisconnected(ComponentName name) {  
    }  

    @Override  
    public void onServiceConnected(ComponentName name, IBinder service) {
        TestService.TestBinder binder =  (TestBinder) service;
        binder.show();
    }  
};
  • 绑定/解绑Service
bindService(serviceIntent, connection, BIND_AUTO_CREATE);
//unbindService(connection);

解除绑定后Service会执行onDestoty方法

如果既 start 又bind 则需要stop unbind 才能销毁Service

IntentService

它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
创建了一个工作队列,来逐个发送intent给onHandleIntent()。
不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。
默认实现的onBind()返回null
默认实现的onStartCommand()的目的是将intent插入到工作队列中

  • 创建IntentService的子类
public class TestIntentService extends IntentService {

public TestIntentService() {
    super("TestIntentService");

}

@Override
public void onCreate() {
    super.onCreate();
    Log.d("TestIntentService", "onCreate");
}
@Override
public void onDestroy() {
    Log.i("TestIntentService", "onDestroy");
    super.onDestroy();
}
@Override
protected void onHandleIntent(Intent intent) {
    getBaiduData();
}

private void getBaiduData() {
    try {
        URL imageUrl = new URL("https://www.baidu.com/");
        HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
        conn.setConnectTimeout(10000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode() == 200) {
            InputStream is = conn.getInputStream();
            Log.d("TestIntentService", readInputStream(is));
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private String readInputStream(InputStream is) {
    InputStreamReader isReader = new InputStreamReader(is);
    BufferedReader bufferReader = new BufferedReader(isReader);
    String inputLine = null;
    StringBuffer result = new StringBuffer();
    try {
        while ((inputLine = bufferReader.readLine()) != null) {
            result.append(inputLine);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result.toString();
}
  • 声明Service
<service android:name="com.speed.test.TestIntentService"/>
  • 启动, 无需Stop
Intent intServiceIntent = new Intent(this, TestIntentService.class);
startService(intServiceIntent);

Service 和 Thread 的区别

二者没有什么关系,Service是没有界面的后台服务,不能执行耗时操作,在Activity开启的子线程并不会自动随Activity的destroy而关闭。

(责任编辑:好模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容