2017-08-30 159 views
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"/> 

問題是,我想完成整個「下載和數據庫填充」 - 完全獨立於啓動服務的應用程序的狀態(以便用戶可以在服務使用時使用其他應用程序做它的工作)。

編輯(產地:錯誤的假設)

以下行爲怪異:

  1. 開始應用
  2. 啓動服務
  3. 關閉應用程序(運行 - 應用 - 概述滑開)
  4. 啓動應用程序之前服務已完成
  5. 「服務啓動」 - toast顯示,handleMessage()被調用,DatabaseErros發生(因爲唯一的約束,但那不是重點)。

另一種情況:

  1. 開始應用
  2. 啓動服務
  3. 關閉應用
  4. fillTables()(運行 - 應用 - 概述滑開)已經完成。
  5. 看來,直接 fillTables()已完成,並重新啓動服務(吐司顯示)。

Q1:那麼,是我的錯,是正在運行的服務是怎麼回事,當我啓動應用程序,同時正在運行的服務尚未完成重新啓動嗎?

Q1.1:如何在完成工作的同時調用/創建一個完全獨立的服務,該服務不會以這種惱人的方式重新啓動?

回答

-1

滑開應用程序將其置於強制關閉狀態。殺死附屬於它的任何服務。它不會允許應用中的服務或任何其他活動在用戶啓動之前再次運行。

現在,如果用戶沒有刷卡,那麼無論前臺應用程序是什麼,您的服務都將繼續運行。如果服務被操作系統殺死了資源,你可以讓它在有可用時自動重啓。但是沒有任何東西會讓它在被刷掉後運行服務。

+0

>滑開應用會使其處於強制關閉狀態。這會殺死附屬於它的任何服務。<從我的經驗來看,這不是真的。我的意思是'onStartCommand()'中返回START_REDELIVER_INTENT;'的意思,而不是在應用程序關閉時終止服務。 >但是沒有任何東西會讓它在被移除後運行服務。<...那不是我要求的 – Nico

+0

不,start_redeliver_intent的要點是如果操作系統停止它,則重新啓動它,而不是如果用戶停止它。在用戶關閉應用程序後,您無法重新啓動或繼續運行。 –

+0

再次。當用戶關閉應用程序時,該服務不會停止。當服務當前正在運行並且用戶再次啓動應用程序時,服務會再次啓動,該應用程序之前已關閉。 – Nico

相關問題