0
我試圖實現存檔,即我的服務下載信息並在後臺使用該信息填充數據庫。已解決的Android:服務在應用程序啓動後重新啓動
SOLUTION(使用前臺服務,代碼現在編輯的版本)
這就是該服務:
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"/>
問題是,我想完成整個「下載和數據庫填充」 - 完全獨立於啓動服務的應用程序的狀態(以便用戶可以在服務使用時使用其他應用程序做它的工作)。
編輯(產地:錯誤的假設)
以下行爲怪異:
- 開始應用
- 啓動服務
- 關閉應用程序(運行 - 應用 - 概述滑開)
- 啓動應用程序之前服務已完成
- 「服務啓動」 - toast顯示,handleMessage()被調用,DatabaseErros發生(因爲唯一的約束,但那不是重點)。
另一種情況:
- 開始應用
- 啓動服務
- 關閉應用
- fillTables()(運行 - 應用 - 概述滑開)已經完成。
- 看來,直接後 fillTables()已完成,並重新啓動服務(吐司顯示)。
Q1:那麼,是我的錯,是正在運行的服務是怎麼回事,當我啓動應用程序,同時正在運行的服務尚未完成重新啓動嗎?
Q1.1:如何在完成工作的同時調用/創建一個完全獨立的服務,該服務不會以這種惱人的方式重新啓動?
>滑開應用會使其處於強制關閉狀態。這會殺死附屬於它的任何服務。<從我的經驗來看,這不是真的。我的意思是'onStartCommand()'中返回START_REDELIVER_INTENT;'的意思,而不是在應用程序關閉時終止服務。 >但是沒有任何東西會讓它在被移除後運行服務。<...那不是我要求的 – Nico
不,start_redeliver_intent的要點是如果操作系統停止它,則重新啓動它,而不是如果用戶停止它。在用戶關閉應用程序後,您無法重新啓動或繼續運行。 –
再次。當用戶關閉應用程序時,該服務不會停止。當服務當前正在運行並且用戶再次啓動應用程序時,服務會再次啓動,該應用程序之前已關閉。 – Nico