Sevice详解

mac2026-03-13  5

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) { } }

杀不死的服务

https://blog.csdn.net/Peterpan1223/article/details/81366210

最新回复(0)