运行后台服务的Android不冻结UI
问题描述:
我需要每5分钟后,登录到设备存储“一些文本”可有人点我做到这一点的最好办法。 但我不想让主线程冻结和记录线程应该是活着的时间。 我试过,但它似乎冻结我的模拟器 有没有更好的方式做同样的运行后台服务的Android不冻结UI
public class DataWriteService extends Service {
private FileIOHelper fileHelper= new FileIOHelper("Test.txt");
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Gets location and writes to a file
fileHelper.writeToFile(this, "Some text");
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
答
使用Handler
或单独的后台线程来完成您长时间工作。一旦完成,将该值发布到UI线程上。
顺便说一句,在Android O +,该服务将只只要你的应用程序是活的运行。一旦你的应用程序进入后台,该应用程序将关闭该服务。考虑使用的jobscheduler
引用[用于'Service'所述的JavaDoc](https://developer.android.com/reference/android/app/Service.html): “A服务不是线程”,并在[该对于'onStartCommand()'](https://developer.android.com/reference/android/app/Service.html#onStartCommand(android.content.Intent,%20int,%20int))的JavaDoc:“需要注意的是该系统调用此对您的服务的主线程...你应该总是避免拖延主线程的事件循环。当进行长时间运行的操作,网络电话,或者大量的磁盘I/O,你应该启动新线程”。你还没有开始线程,所以你的工作正在冻结你的UI。 – CommonsWare