【发布时间】:2017-08-30 15:55:24
【问题描述】:
我正在努力实现,我的服务会在后台下载信息并使用该信息填充数据库。
解决方案(使用前台服务,代码现在是编辑版本)
这就是服务:
public class UnitPullService extends Service {
private final static String name = UnitPullService.class.getSimpleName();
public static Boolean isRunning = false;
private Looper mServiceLooper;
private ServiceHandler mServiceHandler;
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
try {
UnitDataSource unitdataSource = new UnitDataSource(getApplicationContext());
unitdataSource.fillTables();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor spEitor = sharedPreferences.edit();
// disables the button which starts this service
spEitor.putBoolean("isFilled", true);
spEitor.commit();
} catch (JSONException e) {
e.printStackTrace();
}
stopSelf(msg.arg1);
}
}
@Override
public void onCreate() {
HandlerThread thread = new HandlerThread("ServiceStartArguments",
Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// PART OF THE SOLUTION
startForeground(1000, new Notification());
Toast.makeText(this, "service starting",
Toast.LENGTH_SHORT).show();
// to check if the service is currently running
isRunning = true;
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
mServiceHandler.sendMessage(msg);
return START_REDELIVER_INTENT;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
}
}
这就是活动中的意图(实际上来自片段):
Intent i= new Intent(getContext(), UnitPullService.class);
getContext().startService(i);
在清单中,服务声明如下:
<service
android:name=".UnitPullService"
android:exported="false"/>
关键是,我想做整个“下载和数据库填充”——完全独立于启动服务的应用程序的状态(以便用户可以在服务执行时使用其他应用程序)工作)。
编辑(做出错误假设)
以下行为很奇怪:
- 开始申请
- 启动服务
- 关闭应用程序(从 running-apps-overview 滑开)
- 在服务完成之前启动应用程序
- “服务启动”-toast 出现,handleMessage() 被调用并且 DatabaseErros 发生(因为独特的约束,但这不是重点)。
另一种情况:
- 开始申请
- 启动服务
- 关闭应用程序(从 running-apps-overview 滑开)
- fillTables() 已完成。
- 似乎直接在 fillTables() 完成并重新启动服务(Toast 出现)之后。
Q1:那么我的错在哪里,当我启动应用程序而正在运行的服务尚未完成时,正在运行的服务将重新启动?
Q1.1:我如何调用/创建一个完全独立的服务,它在工作时不会以如此讨厌的方式重新启动?
【问题讨论】:
标签: android service background restart foreground