Android Service介绍和使用
什么是Service
Service服务是Android四大组件之一,是一种程序后台运行的方案,用于不需要用户交互,长期运行的任务
Service并不是在单独进程中运行,也是运行在应用程序进程的主线程中,在执行具体耗时任务过程中要手动开启子线程,应用程序进程被杀死,所有依赖该进程的服务也会停止运行
创建Service
右键包名,new→Service→Service,然后finish就会完成创建并且在AndroidManifest.xml中自动注册该Service
或者new→Class,然后extend Service,然后手动在AndroidManifest.xml中注册该Service
enable表示允许Service运行,exported表示允许其他应用隐式调用该服务
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@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 onDestroy() {
super.onDestroy();
}
}
Service启动方式
Service启动分为普通启动和绑定启动:startService()和bindService()
普通启动服务和停止服务
先介绍普通启动,普通启动有三个回调方法:
onCreate()服务创建时调用
onStartCommand()服务启动时调用
onDestroy()服务销毁时调用
启动的代码:
Intent intent=new Intent(this,MyService.class);
startService(intent);
Intent intent2=new Intent(this,MyService.class);
stopService(intent2);
onCreate()只在服务创建时调用,服务只创建唯一实例,重复启动服务,只会调用 onStartCommand()
多次启动只需一次停止服务即可
下面我连续按了5下启动服务,然后停止服务,打印日志
(服务自身stopSelf()方法也可以停止服务)
绑定启动服务和解绑服务:
一种Activity和Service可以进行通信/交互的启动方式
Service还有一个回调方法用于绑定服务:
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
下面是绑定启动的代码例子:
Service代码:自定义了一个Binder内部类,包含具体执行操作(这里用打印日志代替),然后在onBind()中返回Binder对象
public class MyService extends Service {
private static final String TAG = "MyService";
//初始化自定义的Binder对象
private MyCustomBinder mBinder=new MyCustomBinder();
public MyService() {
}
//自定义的内部Binder类
class MyCustomBinder extends Binder{
public void startDoSomething(){
Log.i(TAG, "startDoSomething: ");
}
public void getProgress(){
Log.i(TAG, "getProgress: ");
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.i(TAG, "onBind: ");
return mBinder;
}
}
进行绑定操作的Activity中的代码:初始化MyService.MyCustomBinder对象和ServiceConnection对象,然后绑定启动.
ServiceConnection的onServiceConnected()在绑定Service时调用,在onBind()回调之后,onServiceDisconnected()只有在异常解绑停止服务时调用,正常解绑不会调用
BIND_AUTO_CREATE参数表示绑定Service时创建Service,解绑Service时停止Service
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
private MyService.MyCustomBinder myCustomBinder;
private ServiceConnection serviceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, "onServiceConnected: ");
myCustomBinder= (MyService.MyCustomBinder) service;
myCustomBinder.startDoSomething();
myCustomBinder.getProgress();
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG, "onServiceDisconnected: ");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button3=findViewById(R.id.button3);
Button button4=findViewById(R.id.button4);
button3.setOnClickListener(this);
button4.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id=v.getId();
switch (id){
case R.id.button3:
//绑定启动Service
Intent intent3=new Intent(MainActivity.this,MyService.class);
bindService(intent3,serviceConnection,BIND_AUTO_CREATE);
break;
case R.id.button4:
//解绑Service
unbindService(serviceConnection);
break;
}
}
}
多次点击绑定,然后解绑,查看打印日志:
绑定启动不会调用 onStartCommand(),而是调用onBind(),并且多次点击绑定并不会重复绑定也不会重复调用onBind()和onServiceConnected()
(与Service绑定的Activity出栈时(finish),Service自动解绑并且停止)
服务的生命周期
onCreate→onStartCommand()/onBind→onDestroy
创建,运行,停止
Service可以同时进行普通启动和绑定,启动和绑定的都是Service的唯一实例
在停止时要同时解绑和停止,才能使Service进入停止调用onDestroy
前台服务
服务在后台运行,优先级比较低,当内存不足时可以会被系统回收,可以使用前台服务
前台服务会在状态栏中显示图标,并且下拉状态栏,可以在通知栏中看到详细信息,类似于通知
(API26开始使用新的方法来实现前台服务startForegroundService(),还需要研究一下怎么用)
IntentService
我们使用Service往往需要手动开启子线程,执行耗时操作,执行完毕后可以选择stopSelf()停止服务
IntentService的作用就和上面一样,它的onHandleIntent()回调方法就是在子线程里面执行耗时操作,并且onHandleIntent()执行完毕之后会自动停止服务