1.Service:android四大组件之一,不需要与用户交互,但可以在后台长期运行的组件。
配置与使用:
*写一个类继承自Service,然后覆写onBinder方法。
*在清单文件中声明Service类。
*通过startService或者bindService启动。
2.启动方式(android5.0之前可以通过隐式启动,之后google要求必须用显式意图启动。)
方法一:
startService():访问者和service没有进行绑定,访问者退出之后,service仍然可以在后台运行。如制作音乐播放器,ac退出之后,仍可以播放。
方法二:
bindService():访问者和service进行了绑定,如果访问者退出,service也将退出。
3.生命周期:
startService启动时:
onCreate()->onStartCommand()->onDestory();
bindService启动时:
onCreate()->onBind()->-onUnBind()->onDestory();
4.基本用法:
*启动服务
Intent startIntent=new Intent(this,MyService.class);
startService(startIntent);
*停止服务
Intent stopIntent=new Intent(this,MyService.class);
startService(stopIntent);
5.活动和服务进行通信
*第一步:在服务类中新建一个类并继承Binder,然后在onBinder()中返回该类的实例,(在该类中可以做一些操作)
*第二步:在活动中创建一个ServiceConnection匿名类,在onServiceConnected()方法中通过乡下转型得到服务中的实例,有了这个实例就可以进行通讯了。
代码如下:
public class MyService extends Service {
private DownLoadBinder mBinder=new DownLoadBinder();
class DownLoadBinder extends Binder{
public void startDownload(){
}
public int getProgress(){
return 0;
}
}
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
public class MainActivity extends Activity implements View.OnClickListener {
Button btn1,btn2;
private MyService.DownLoadBinder downLoadBinder;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
downLoadBinder= (MyService.DownLoadBinder) iBinder;
downLoadBinder.startDownload();
downLoadBinder.getProgress();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1=findViewById(R.id.btn1);
btn2=findViewById(R.id.btn1);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn1:
Intent bindIntent=new Intent(this,MyService.class);
//BIND_AUTO_CREATE标志位,表示活动和服务进行绑定后自动创建服务。
bindService(bindIntent,connection,BIND_AUTO_CREATE);
break;
case R.id.btn2:
unbindService(connection);
break;
}
}
}
*讲解:这里首先创建一个ServiceConnection匿名类,在里面重写onServiceConnected()和onServiceDisConnected()方法,这两个方法分别会在活动与服务成功绑定以及解除绑定的时候调用。在onServiceConnected()方法中,又通过向下转型得到DownLoadBinder实例,有了这个实例,活动和服务之间的关系就变得紧密了。
6.前台服务
*作用:提高优先级,防止内存不足时,被回收。
Intent intent=new Intent(this,MainActivity.class);
PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);
Notification notification=new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),
R.mipmap.ic_launcher))
.setContentIntent(pi)
.build();
//启动前台服务
startForeground(1,notification);
7.IntentService
*解决ANR问题,并且运行完毕后,会自动停止。
*创建方式
public class MyIntentService extends IntentService {
public MyIntentService(){
//调用父类的有参构造方法
super("MyIntentService");
}
//子线程中运行,可以做一些逻辑处理
@Override
protected void onHandleIntent(@Nullable Intent intent) {
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
*启动方式
Intent intentService=new Intent(this,MyIntentService.class);
startService(intentService);