android service的使用方法,Android Service基本使用

Service 是 Android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),与Activity的不同是Service只能运行在后台,Service没有界面并且生命周期也与Activity不同。一个Service是一个可以长期运行在后台的应用程序组件,不提供用户界面。此外,一个组件可以绑定到一个服务与之交互,甚至执行进程间通信(IPC)。 例如一个服务可以在后台处理网络交易、播放音乐、执行文件 I/O,或与内容提供者交互等。

a81d4207c8ae

Service生命周期图

1. Service启动方式

1)启动服务方式

startService方式

onCreate():服务创建时调用

onStartCommand():服务被调用开启方法时调用

onDestroy():服务销毁时调用

当一个Service在被使用 startService方法启动,不管是否调用了 bindService(绑定服务)或 unbindService(解除绑定服务)到该Service,该Service都会在后台运行并不受影响。一个Service被使用 startService方法启动多少次,onCreate方法只会调用一次,onStartCommand方法将会被调用多次(与 startService的次数一致),且系统只会创建一个Service实例(结束该Service也只需要调用一次 stopService),该Service会一直在后台运行直至调用 stopService或调用自身的 stopSelf方法。

bindService方式

onCreate():服务创建时调用

onBind():服务被绑定时调用

onServiceConnected():服务连接时调用

onUnbind():服务被解绑时调用

onDestroy():服务销毁时调用

当一个Service在被使用 bindService方法启动,不论 bindService被调用几次,Service的 onCreate方法只会执行一次,同时 onStartCommand方法始终不会调用。

混合方式

onCreate():服务创建时调用

onStartCommand():服务被调用开启方法时调用

onBind():服务被绑定时调用

onServiceConnected():服务连接时调用

onUnbind():服务被解绑时调用

onDestroy():服务销毁时调用

当一个Service在被启动(startService的同时又被绑定 bindService),该Service将会一直在后台运行,并且不管调用几次,onCreate方法始终只会调用一次,onStartCommand的调用次数与 startService调用的次数一致(使用 bindService方法不会调用 onStartCommand)。同时,调用 unBindService将不会停止Service,必须调用 stopService或 Service自身的 stopSelf来停止服务。

2)启动服务区别

startService:

(1) 调用者退出后,Service仍然存在;

(2) startService()和stopService()只能开启和关闭Service,无法操作Service

bindService:

(1) 调用者退出后,Service随着调用者销毁;

(2) bindService()和unbindService()可以操作Service

2. Service基本用法

startService方式启动服务

1) 继承 Service

(1) 新建一个MyService继承自Service,并重写父类方法;

public class MyService extends Service {

@Nullable

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onCreate() {

super.onCreate();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

return super.onStartCommand(intent, flags, startId);

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

}

@Override

public void onDestroy() {

super.onDestroy();

}

}

(2) 在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;

...

...

(3) 通过startService()启动,stopService()停止服务。

Intent intent = new Intent(this, MyService.class);

//开启服务

startService(intent);

//停止服务

stopService(intent);

2)继承 IntentService

因为Service中几个方法的回调都是在主线程中,如果使用Service执行特别耗时的操作,建议单独新建线程去操作,避免阻塞主线程(UI线程)。IntentService在内部帮我们新建的线程,执行完毕任务后会自动关闭,无需手动结束它。

(1) 新建一个MyService继承自IntentService,并重写父类方法;

public class MyService extends IntentService {

public MyService() {

super("MyService");

}

@Override

protected void onHandleIntent(Intent intent) {

}

@Override

public void onCreate() {

super.onCreate();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

return super.onStartCommand(intent, flags, startId);

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

}

@Override

public void onDestroy() {

super.onDestroy();

}

}

(2) 在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;

...

...

(3) 通过startService()启动服务

Intent intent = new Intent(this, MyService.class);

//开启服务

startService(intent);

bindService方式启动服务

1)新建一个MyService继承自Service,在MyService中增加了一个内部类MyBinder,并重写父类方法;

public class MyService extends Service {

@Nullable

@Override

public IBinder onBind(Intent intent) {

return new MyBinder();

}

@Override

public void onCreate() {

super.onCreate();

}

@Override

public boolean onUnbind(Intent intent) {

return super.onUnbind(intent);

}

@Override

public void onDestroy() {

super.onDestroy();

}

class MyBinder extends Binder {

public MyService getService() {

return MyService.this;

}

}

}

2)通过bindService()绑定服务,通过unbindService()解绑服务。

MyService myService;

ServiceConnection mConnection = ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

MyService.MyBinder binder = (MyService.MyBinder) service;

mService = binder.getService();

}

@Override

public void onServiceDisconnected(ComponentName name) {

myService = null;

}

};

Intent intent = new Intent(this, MyService.class);

// 绑定服务

bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

// 解绑服务

unbindService(mConnection);

混合方式启动服务

1)新建一个MyService继承自Service,在MyService中增加了一个内部类MyBinder,并重写父类方法;

public class MyService extends Service {

@Nullable

@Override

public IBinder onBind(Intent intent) {

return new MyBinder();

}

@Override

public void onCreate() {

super.onCreate();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

return super.onStartCommand(intent, flags, startId);

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

}

@Override

public void onDestroy() {

super.onDestroy();

}

class MyBinder extends Binder {

public MyService getService() {

return MyService.this;

}

}

}

2)在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;

...

...

3)通过startService()启动,stopService()停止服务。

MyService myService;

ServiceConnection mConnection = ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

MyService.MyBinder binder = (MyService.MyBinder) service;

mService = binder.getService();

}

@Override

public void onServiceDisconnected(ComponentName name) {

myService = null;

}

};

Intent intent = new Intent(this, MyService.class);

//开启并绑定服务

startService(intent);

bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

// 解绑服务

unbindService(mConnection);

//停止服务

stopService(intent);

3. Service生命周期

参考

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值