自定义类继承Service类,并在AndroidManifest中注册:
<application …>
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" />
application>
自定义Service常用的重写方法以及作用:
方法名 | 作用 |
---|---|
onCreate | 服务创建时调用 |
onStartCommand | 服务启动时调用 |
onDestory | 服务销毁时调用 |
onBind | 用于Service和Activity之间的通信,让Activity可以控制运行中的Service |
启动和停止Service:
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent);
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent);
或者可以在Service中通过调用stopSelf();
方法来停止该服务
虽然说onBind方法用于和service进行通信,但是单纯只是onBind方法是无法完成这个功能的。
基本的通信构建过程:
//获取一个自定义类对象作为oonBind方法的返回值
private DownloadBinder mBinder = new DownloadBinder();
//自定义Binder类,类中方法将在Activiy中调用
class DownloadBinder extends Binder {
public void startDownload() {
Log.d(TAG, "StartDownload!");
}
public int getProgress() {
Log.d(TAG, "getProgress. ");
return 0;
}
}
@Override
public IBinder onBind(Intent intent) {
//返回Binder对象使Activity可以调用方法来执行相应操作
return mBinder;
}
ServiceConnection常用的重写方法:
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyService.DownloadBinder downloadBinder = (MyService.DownloadBinder) service;
downloadBinder.startDownload();
downloadBinder.getProgress();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Activity和Service的绑定:
使用bindService方法将Activity和Service绑定。这里如果绑定时服务没有启动,那么执行这个方法之前系统将会先启动服务。
//绑定
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
//解绑
unbindService(connection);
这里需要注意的是,如果Service和Activity绑定之后,使用stopService是无法停止服务的,必须调用unbind方法断开连接之后才可以通过stopService停止。
服务都是在后台运行,而且其系统优先级也比较低。所以如果系统出现内存不足的情况时就有可能出现系统回收掉正在运行的服务,而前台服务正是解决这种问题的办法。
前台服务与后台服务的区别会有一个通知常驻于通知栏。
使用方法:
其实很简单,只需要在onCreate方法中添加一点东西就行了
@Override
public void onCreate() {
super.onCreate();
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
Notification notification = new Notification.Builder(this)
.setContentTitle("前台服务")
.setContentText("This is a Service")
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentIntent(pendingIntent)
.setWhen(System.currentTimeMillis())
.build();
//使用startForeground方法来启动
startForeground(1, notification);
}
IntentService是Android专门提供的一个用于创建服务的类,其优点在于:
这个类很好的解决了忘记开启线程执行耗时操作或者在服务执行完毕后没有及时关闭服务的问题,而且相比较自行创建服务,使用IntentService更为简单快捷。
其使用方法也很简单,直接自定义一个IntentService类来继承它就可以了:
public class MyIntentService extends IntentService {
public MyIntentService() {
//此处的name参数仅用于调试时用来区别服务,可以自行设定
super("MyIntentService");
}
//服务需要执行的耗时操作或者服务需要执行的逻辑操作
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Log.d("MyService", "Thread id is "+Thread.currentThread().getId());
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("MyService", "Service Stop");
}
}
启动和正常服务的启动方法一样
Intent intentService = new Intent(this, MyIntentService.class);
startService(intentService);
另外不能忘的是,它是个服务,也是需要在AndroidManifest中注册的:
<service
android:name=".MyIntentService"
android:enabled="true"
android:exported="true" />