我想创建一个简单的虚拟前台任务来了解它的行为。不幸的是我有一些问题。首先是代码:
public class ImageSendEmailService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent.getAction().equals(ForegroundServiceTags.STARTFOREGROUND_ACTION.getValue())) {
for (int i = 0; i <= 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String notificationText = String.valueOf((int) (100 * i / 10)) + " %";
Notification.Builder builder = new Notification.Builder(this);
builder.setContentTitle("Progress");
builder.setContentText(notificationText);
builder.setTicker("Notification!");
builder.setWhen(System.currentTimeMillis());
builder.setDefaults(Notification.DEFAULT_SOUND);
builder.setAutoCancel(true);
builder.setSmallIcon(R.drawable.ic_launcher);
Notification notification = builder.build();
this.startForeground(101, this.notification);
}
}
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
我遇到的第一个问题是该服务正在卡住应用程序的用户界面。 UI 在 Service
完成其工作后继续运行,但在执行时被卡住。
我遇到的第二个问题是,当工作完成时,100% 通知显示在设备的通知选项卡中,我无法删除它。我需要它在工作时不可删除,但在完成工作后可删除。
最佳答案
阅读this
如果你想做一个会阻塞主线程的任务,你基本上必须产生一个新线程。
为您的notification问题
.setOngoing(true)
将使通知无法终止
一旦你的任务完成,用一个新的覆盖通知
.setOngoing(false)
为此你必须保存通知 id,或者只是从代码中删除你自己
编辑: 工作完成后,您还必须调用 stop self。而是根本不要弄乱通知。由于它是前台服务,因此在服务完成之前您无法删除通知
关于android - 前台服务卡住用户界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27207013/