一个前台服务是指您将其置于前台状态的服务,这意味着如果系统需要CPU或者您的应用已关闭,则系统不会杀死该进程。
首先,您有三种类型的服务:
- 启动服务(在UI线程中运行)
- IntentService(在自己的线程中运行)(请参见
Services vs IntentServices)
- 绑定服务(只要有一个活动绑定了它,就会一直运行)
如上所述,如果您关闭应用程序,则绑定服务也将被关闭,它是通过
bindService()启动的。
IntentService
是
Service
的子类型,它简化了针对传入意图的"工作队列流程",即它会在队列中逐个处理传入的意图,正如
IntentService description中所说。它具有默认实现,并通过
startService()启动。它主要用于异步任务。
已启动服务是由组件启动的服务,直到调用stopService()或关闭您的应用程序才会继续存在。
使用前台服务使您的Service
持久化。您必须在服务内部调用startForeground()。它将一直运行,直到您停止Service
,例如使用stopSelf()或stopService();
注意:每次调用startService()时都会触发onStartCommand(),但只有在第一次创建时才会触发onCreate()
。
这是一个简单的前台启动服务实现:
在您的Manifest.xml文件中:
<service android:name=".ConnectionService"
android:enabled="true"/>
在MyService.java文件中:
public class MyService extends Service {
private final static int NOTIFICATION_ID = 95;
private NotificationManager mNotificationManager;
public MyService() { super(); }
@Override
public void onCreate() {
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
mBuilder.setSmallIcon(R.mipmap.ic_small_icon);
mBuilder.setContentTitle("MyService");
mBuilder.setContentText("The Service is currently running");
startForeground(NOTIFICATION_ID, mBuilder.build());
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
mNotificationManager.cancel(NOTIFICATION_ID);
}
}
最后只需调用
startService()即可。