简要概述一下,还有很多知识点并没有涉及,对自己来说当个笔记来总结巩固下,后续有可能更新完善,在文章中的问题欢迎大佬指出点评
关于Service首先了解下他的作用与特点
1.不和用户交互,在后台执行的长期任务,即使App切换到后台
2.Service并不是运行在一个独立的进程,而是依赖在创建服务的App进程
3.不会自动开启线程,所有代码在主线程中执行,为了防止阻塞主线程需要我们手动在 Service中创建子线程
4.什么是前台服务和后台服务:
一.你可以看到的就叫做前台服务,下载App和听音乐的时候,你可以从状态栏看到进度条和音乐的播放
二.你看不见的就叫后台服务
5.当系统内存不足是有可能会回收服务,因为后台服务优先级低,如果不被回收可使用前台服务
直接上代码—Service使用
/**
* 继承Service 并实现OnBind方法
*/
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("MyService","onBind");
return null;
}
/** 创建服务的时候调用 */
@Override
public void onCreate() {
super.onCreate();
Log.i("MyService","onCreate");
}
/** 每次服务启动的时候调用 */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("MyService","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
/** 服务销毁的时候调用 */
@Override
public void onDestroy() {
super.onDestroy();
Log.i("MyService","onDestroy");
}
}
清单文件中放入
<service android:name=".MyService" />
public class MainActivity extends AppCompatActivity {
private Button btnStart;
private Button btnStop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//启动服务
btnStart.setOnClickListener(v->{
startService(new Intent(this,MyService.class));
});
//停止服务
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MyService.class);
stopService(intent);
}
});
}
private void initView() {
btnStart = findViewById(R.id.btn_start);
btnStop = findViewById(R.id.btn_stop);
}
}
当你第一次点击后,会执行MyService类中的OnCreate -> onStartCommand,再次点击只会执行onStartCommand,也就是说多次创建只会执行一次OnCreate方法,点击Stop就执行OnDestory
如何查看服务是否运行:
从模拟器中 开发者模式里面有一个叫做 正在运行的服务,当点击Start按钮和Stop可以看到你App名称是否启动该服务
使用案例
以Android第一行代码中讲解的Service案例为例
问题:Activity启动完服务以后没有关联,无法获取Service引用
1.创建一个类
public class DownLoadBinder extends Binder {
public void startDownload(){
Log.i("MyService","开始下载");
}
public int getProgress(){
Log.i("MyService","获取下载进度");
return 0;
}
}
2.在MyService中实例化创建的类并让onBind方法返回这个实例类
/**
* 继承Service 并实现OnBind方法
*/
public class MyService extends Service {
private DownLoadBinder downLoadBinder = new DownLoadBinder();
@Nullable
@Override
public IBinder onBind(Intent intent) {
return downLoadBinder;
}
/** 创建服务的时候调用 */
@Override
public void onCreate() {
super.onCreate();
Log.i("MyService","onCreate");
}
/** 每次服务启动的时候调用 */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("MyService","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
/** 服务销毁的时候调用 */
@Override
public void onDestroy() {
super.onDestroy();
Log.i("MyService","onDestroy");
}
}
3. 实例ServiceConnection类并重写两个方法,新增两个按钮
public class MainActivity extends AppCompatActivity {
private Button btnStart;
private Button btnStop;
private Button btnBind;
private Button btnUnbind;
private DownLoadBinder downLoadBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//启动服务
btnStart.setOnClickListener(v -> {
startService(new Intent(this, MyService.class));
});
//停止服务
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MyService.class);
stopService(intent);
}
});
//绑定服务
btnBind.setOnClickListener(v->{
/**
* 第二个参数 放入ServiceConnection实例
* 第三个参数 表示在活动和服务进行绑定后自动创建服务
*/
bindService(new Intent(this,MyService.class),connection,BIND_AUTO_CREATE);
});
//解绑服务
btnUnbind.setOnClickListener(v->{
unbindService(connection);
});
}
private ServiceConnection connection = new ServiceConnection() {
//在服务绑定成功调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
downLoadBinder = new DownLoadBinder();
downLoadBinder.startDownload();
downLoadBinder.getProgress();
}
//在服务解绑成功调用
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
private void initView() {
btnStart = findViewById(R.id.btn_start);
btnStop = findViewById(R.id.btn_stop);
btnBind = findViewById(R.id.btn_bind);
btnUnbind = findViewById(R.id.btn_unbind);
}
}
当我们运行以后,点击绑定按钮会打印 onCreae->开始下载->获取下载进度
注意:如果用startService启动服务,用stopService关闭
如果用bindService绑定服务,用unbindService来解绑
如果即用startService也用bindService,那么也需要调用stopService和unbindService