前台服务是那些被认为用户知道(用户所认可的)且在系统内存不足的时候不允许系统杀死的服务。前台服务必须给状态栏提供一个通知,它被放到正在运行(Ongoing)标题之下——这就意味着通知只有在这个服务被终止或从前台主动移除通知后才能被解除。
在一般情况下,Service几乎都是在后台运行,一直默默地做着辛苦的工作。但这种情况下,后台运行的Service系统优先级相对较低,当系统内存不足时,在后台运行的Service就有可能被回收。
那么,如果我们希望Service可以一直保持运行状态且不会在内存不足的情况下被回收时,可以选择将需要保持运行的Service设置为前台服务。
若要把Service设置为前台服务,并在通知栏设置通知消息,要在Service的onStartCommand()方法中进行配置
public class MyService extends Service {
private boolean running = false;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
running = true;
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread() {
@Override
public void run() {
super.run();
while (running) {
System.out.println("服务正在运行...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
Notification.Builder builder = new Notification.Builder(this.getApplicationContext());
Intent nfIntent = new Intent(this,MainActivity.class);
builder.setContentIntent(PendingIntent.getActivity(this,0,nfIntent,0))
//设置通知栏大图标
.setLargeIcon(BitmapFactory.decodeResource(this.getResources(),R.drawable.admin))
//设置服务标题
.setContentTitle("服务123")
//设置状态栏小图标
.setSmallIcon(R.drawable.admin)
//设置服务内容
.setContentText("服务正在运行")
//设置通知时间
.setWhen(System.currentTimeMillis());
Notification notification = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
notification = builder.build();
}
//设置通知的声音
notification.defaults = Notification.DEFAULT_SOUND;
startForeground(110,notification);
return super.onStartCommand(intent,flags,startId);
}
@Override
public void onDestroy() {
super.onDestroy();
running = false;
stopForeground(true);
Log.i("Service","onDestroy");
}
}