Android基础复习之服务(Service)
- 作者:朱红喜
1.服务的生命周期
1.概述
2.生命周期方法
- 方式一
onBind()//抽象方法必须重写,但是方式一下不需要用到它,返回一个null对象即可
onCreate()//Service创建时调用
onStartCommand()//每次服务被启动时调用
onDestroy()//服务被销毁前调用
- 方式二
onCreate()//Service创建时调用
onBind()//抽象方法必须重写,返回我们的Binder对象
onUnBind()//解绑客户端和服务
onReBind()//客户端和服务再次绑定时调用onCreate()
onDestroy()//服务被销毁前调用
2.创建服务
- 方式一:包下右键->new ->Service
- 方式二:新建一个类继承于Service类
//Android的四大组件,只有定义了,就必须去AndroidManifest.xml中注册一下!!!
public class TestService extends Service {
private final String TAG = "TestService";
//必须实现的方法
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind方法被调用");
return null;
}
//Service被创建时调用
@Override
public void onCreate() {
Log.e(TAG, "onCreate方法被调用");
super.onCreate();
}
//Service被启动时调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand方法被调用");
return super.onStartCommand(intent, flags, startId);
}
//Service被销毁时调用
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy方法被调用");
super.onDestroy();
}
3启动和停止服务
- 方式一:startService()启动服务
Intent intent = new Intent();
intent.setAction("你服务的action");
//Android 5.0之后,隐式调用是除了设置setAction()外,还需要设置setPackage();
intent.setPackage("你的包名");
startService(intent);
停止服务
stopService(intent);
或者stopSelf();
- 方式二:bindService()启动服务
public class TestService extends Service {
private final String TAG = "TestService";
private int count = 0;
private boolean quit = false;
private MyBinder myBinder = new MyBinder();
//定义onBinder方法所返回的对象
public class MyBinder extends Binder {
public int getCount() {
return count;
}
}
//必须实现的方法
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind方法被调用");
return myBinder;
}
//Service被创建时调用,服务运行于主线程,所以标准的服务应该时另开一个线程处理业务
@Override
public void onCreate() {
Log.e(TAG, "onCreate方法被调用");
super.onCreate();
new Thread(new Runnable() {
@Override
public void run() {
//你的逻辑代码和判断服务什么时候执行完的代码
}).start();
}
//Service断开连接时回调
@Override
public boolean onUnbind(Intent intent) {
Log.e(TAG, "onUnbind方法被调用!");
return true;
}
//Service被销毁时调用
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy方法被调用");
this.quit = true;
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
Log.e(TAG, "onRebind方法被调用!");
}
}
绑定服务/解绑服务
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Intent intent;
//绑定服务需要一个ServiceConnection对象
TestService.MyBinder myBinder;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("Service Connected->success!");
myBinder = (TestService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("Service Disconnected->failed!");
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
intent = new Intent();
intent.setAction("你服务的action");
//Android 5.0之后,隐式调用是除了设置setAction()外,还需要设置setPackage();
intent.setPackage("你的包名");
bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);//绑定服务
}
@Override
protected void onDestroy() {
super.onDestroy();
}
...
unbindService(serviceConnection);//解绑服务
...
}
4.前台服务
类似于通知的形式在下拉状态栏可以看到,优先级较高,可以跟用户交互
1.创建前台服务
class MyService extend Service{
...
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this,MainActivity.class);
PendingIntent pi = PengdingIntent.getActivity(this,0,intent,0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("标题")
.setCOntentText("内容文本")
.setSmallIcon()//小图标
.setLargeIcon()//大图标
.setContentIntent(pi)
.build();
startForegroud(1,notification);
}
...
}
停止前台服务(添加在onDestroy()方法中)
stopForeground(true);// 停止前台服务--参数:表示是否移除之前的通知
5.intentService
1.优点
IntentService 是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,启动 IntentService 的方式和启动传统 Service 一样,同时,当任务执行完后,IntentService 会自动停止,而不需要我们去手动控制。另外,可以启动 IntentService 多次,而每一个耗时操作会以工作队列的方式在IntentService 的 onHandleIntent 回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。而且,所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。 那么,用 IntentService 有什么好处呢?首先,我们省去了在 Service 中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止 Service。
2.使用方法
1、创建一个类并继承IntentService
,重写onHandleIntent()
,构造函数super("线程名");
2、在AndroidManifest.xml
里注册,同Service;
3、通过startService()
启动。
public class MyIntentService extends IntentService {
public MyIntentService () {
super("MyIntentService ");//线程名
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
//这个方法是在子线程中,不会导致ANR
}
}
启动
startService(intent)