Service是什么
服务是Android中实现程序后台运行的解决方案,他非常适合是去执行那些不需要和用户交互而且还要长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另一个应用程序,服务仍然能够保持独立运行。不过需要注意的是,服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序被杀掉时,所有依赖该进程的服务也会停止运行。
服务分为两种基本形式:
- 本地服务
- 远程服务
Service的两种状态
服务的两种状态:
- 启动状态
- 绑定状态
Service在清单文件中的声明
<service android:name=".myservice"
android:enabled="true"
android:exported="true"
android:icon="@drawable/background_blue"
android:label="string"
android:process="string"
android:permission="string">
</service>
名字 | 功能 |
---|---|
android:exported | 表示是否允许除了当前程序之外的其他程序访问这个服务 |
android:enabled | 表示是否启用这个服务 |
android:permission | 是权限声明 |
android:process | 是否需要在单独的进程中运行,当设置为android:process=”:remote”时,代表Service在单独的进程中运行。注意“:”很重要,它的意思是指要在当前进程名称前面附加上当前的包名,所以“remote”和”:remote”不是同一个意思,前者的进程名称为:remote,而后者的进程名称为:App-packageName:remote。 |
android:isolatedProcess | 设置 true 意味着,服务会在一个特殊的进程下运行,这个进程与系统其他进程分开且没有自己的权限。与其通信的唯一途径是通过服务的API(bind and start)。 |
Service启动服务实现方式及其详解
- 创建服务
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e("myservice","onBind");
return new MyServiceBinder();
}
@Override
public void onCreate() {
super.onCreate();
Log.e("myservice","onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("myservice","onDestroy");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("myservice","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("myservice","onUnbind");
return super.onUnbind(intent);
}
class MyServiceBinder extends Binder {
public MyService getService(){
return MyService.this;
}
}
}
- 启动/停止服务
public void processClick(View v) {
switch (v.getId()){
case R.id.bt_demo://启动服务
Intent start = new Intent(this,Myservice.class);
startService(start);
break;
case R.id.bt_demo1://停止服务
Intent stop = new Intent(this,Myservice.class);
stopService(stop);
break;
case R.id.button3://绑定服务
bindService(new Intent(this,MyService.class),connection, Service.BIND_AUTO_CREATE);
break;
case R.id.button4://解绑服务
unbindService(connection);
break;
default:
break;
}
}
connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("myservice","onServiceConnected");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("myservice","onServiceDisconnected");
}
};
- 第一次启动服务的时候,会执行service中的
onCreate
还有onStartCommand
(前提是服务在之前还没有进行启动) - 如果服务已经启动,再次启动服务,只会单独调用
onStartCommand
方法 - 使用
stopService()
就能够实现中断服务的启动。
绑定服务
onBind()
-
当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。在此方法的实现中,必须返回 一个IBinder 接口的实现类,供客户端用来与服务进行通信。无论是启动状态还是绑定状态,此方法必须重写,但在启动状态的情况下直接返回 null。
-
使用
bindService()
绑定服务,执行onCreate()——onBind()——onServiceConnected() -
使用
unbindService()
解绑服务,执行onUnbind()——onDestroy()
onStartComand()四个返回值
START_STICKY
:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象,随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null;START_NOT_STICKY
:非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务;START_REDELIVER_INTENT
:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入;START_STICKY_COMPATIBILITY
:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
IntentService的使用
特点:
- InteniService自带一个工作线程,不需要自己创建
- 将要做的工作放到onHandleIntent()方法中
- 当有多个任务传入IntentService中的时候,IntentService也只会维护一个线程,每个任务会采用先来先处理的方法进行执行,当认为所有任务被执行完,会执行onDestroy()回掉方法
public class MyIntentService extends IntentService {
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public MyIntentService(String name) {
super(name);
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(@Nullable Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
}
}
杀不死的服务