我试图实现,我的服务下载信息并在后台填写包含该信息的数据库。
解决方案(使用前台服务,代码现在是编辑版本)
这项服务:
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"/>
关键是,我想整个“下载和数据库填充” - 完全独立于启动服务的应用程序的状态(以便用户可以在服务执行时使用其他应用程序作业)。
编辑(做出错误的假设)
以下表现得很奇怪:
另一种情况:
Q1:那么我的错在哪里,当我正在运行的服务尚未完成时启动应用程序时,正在运行的服务将重新启动?
Q1.1 :我如何调用/创建一个完全独立的服务,在执行其工作时不会以这种厌恶的方式重新启动?
答案 0 :(得分:-1)
轻扫应用程序会将其置于强制关闭状态。这会杀死附加到它的任何服务。在用户启动之前,它不允许应用程序中的服务或任何其他活动再次运行。
现在,如果用户没有滑动,无论前台有什么应用,您的服务都将继续运行。如果该服务被操作系统杀死,您可以在它们可用时自动重启。但是没有任何东西可以让它在被刷掉之后运行服务。