Android笔记-四大组件之Service
2018-05-12 本文已影响0人
948d307d6ecf
简介
Service,即服务,是Android系统中的后台运行程序,用来处理不需要用户界面但是需要长期运行的任务.
标准服务
-
生命周期
onCreate()
方法是在服务第一次创建的时候调用,onStartCommand()
方法在每次启动服务的时候都会被调用(可调用多次,但每个服务只会存在一个实例),onDestroy()
方法是在服务销毁的时候调用. -
基本用法
- 第一步, 自定义一个服务继承自Service类
public class MyService extends Service{ private static final String TAG = "MyService"; @Nullable @Override public IBinder onBind(Intent intent) { Log.d(TAG, "onBind() called"); return null; } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate() called"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand() called"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy() called"); } }
- 第二步, 在menifest文件中注册
<service android:name=".service.MyService" />
- 第三步, 在context(一般是Activity)中启动服务
startService(new Intent(this, MyService.class));
- 第四步, 在context(一般是Activity)停止服务
stopService(new Intent(this, MyService.class));
也可以在MyService中调用
stopSelf()
方法让该服务停止运行.
- 第一步, 自定义一个服务继承自Service类
-
服务与Activity交互
以上方式只能通过在Activity中调用startService()
和stopService()
两个方法来启动和停止服务,如果想要更加精确的控制服务,比如指挥服务做些事情以及从服务那里得到一些反馈,就需要通过Binder
来完成了.- 第一步,自定义Binder
public class MyBinder extends Binder { private static final String TAG = "MyBinder"; //自定义执行任务的方法 public void startDownload() { Log.d(TAG, "startDownload() called"); } //自定义获取进度 public int getProgress() { Log.d(TAG, "getProgress() called"); return 0; } }
- 第二步,自定义Service
public class MyService extends Service{ private static final String TAG = "MyService"; private MyBinder binder = new MyBinder(); @Nullable @Override public IBinder onBind(Intent intent) { Log.d(TAG, "onBind() called"); return binder; } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate() called"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand() called"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy() called"); } }
- 第三步, 在menifest文件中注册
<service android:name=".service.MyService" />
- 第四步, 在Activity中初始化
private MyBinder myBinder; private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d(TAG, "onServiceConnected() called"); myBinder = (MyBinder) service; //指挥服务去执行任务 myBinder.startDownload(); //获取服务的执行反馈 myBinder.getProgress(); } @Override public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "onServiceDisconnected() called"); } };
- 第五步, 在Activity中建立绑定关系
bindService(new Intent(this, MyService.class), this.serviceConnection, BIND_AUTO_CREATE);
- 第六步, 在Activity中解除绑定关系
unbindService(this.serviceConnection);
- onBind()方法获取Binder的示例,从而实现对binder的控制, 该方法会在onCreate()完成后执行;
- 只要调用方和服务的连接没有断开,服务会一直保持运行状态;
- 如果同时调用了
startService()
和bindservice()
方法, 则需要调用stopService()
和unbindService()
方法才能销毁服务.
- 第一步,自定义Binder
IntentService
-
特点
- 执行完成自动停止
- 在
onHandleIntent()
方法中自动开启线程
-
使用方法
- 新建一个类, 继承自IntentService
public class MyIntentService extends IntentService { private static final String TAG = "MyIntentService"; public MyIntentService() { super("MyIntentService"); } @Override protected void onHandleIntent(@Nullable Intent intent) { Log.d(TAG, "onHandleIntent() called with: thread id is: [" + Thread.currentThread().getId() + "]"); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy: ()"); } }
- 在menifest中注册
<service android:name=".service.MyIntentService" android:exported="false" />
- 启动
startService(new Intent(this, MyIntentService.class));