4

開始時,我想爲壞的英語道歉。活動崩潰後的Android停止後臺服務

有我的問題:

我有一個Android的服務,這是活動運行時,在後臺運行。 (此服務以指定的時間間隔與服務器同步用戶數據)。

public class CService extends Service 
{ 
    private Boolean isDestroyed; 



@Override 
    public int onStartCommand (Intent intent, int flags, int startId) 
    { 
      if (intent != null) 
      { 
        new Thread(new Runnable() 
        { 
        //run new thread to disable flush memory for android and destroy this service 
          @Override 
          public void run() 
          { 
            this.isDestroyed = Boolean.FALSE 
            while(!this.isDestroyed) 
            { 
            //loop until service isn't destroyed 
            } 
          } 

        }).start(); 
      } 
      return Service.START_NOT_STICKY; 

    } 

    @Override 
    public void onDestroy() 
    { 
      //THIS ISNT CALLED FROM uncaughtException IN ACTIVITY BUT from onDestroy method is this called. 

      //when is service destroyed then onDestroy is called and loop finish 
      this.isDestroyed = Boolean.TRUE; 
    } 

} 

並從onCreateMethod中的活動開始。此活動實現Thread.UncaughtExceptionHandler並在onCreate方法中註冊以捕獲活動中的所有意外異常。當活動中的某些事件拋出異常方法uncaughtException被調用時,服務應該停止在stopService(serviceIntent);但onDestoy服務不叫。但是當activity中的onDestroy方法被調用時(用戶按下然後返回按鈕)服務被成功停止並且在CService中調用onDestoroy。

public class CActivity extends Activity implements Thread.UncaughtExceptionHandler 
    { 
      private Thread.UncaughtExceptionHandler defaultUEH; 

     @Override 
     protected void onCreate (Bundle savedInstanceState) 
     { 

      this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 

      // create intent for service 
      Intent serviceIntent = new Intent(this, CService.class); 
      // run service 
      startService(serviceIntent); 

      //set default handler when application crash 
      Thread.setDefaultUncaughtExceptionHandler(this); 
      super.onCreate(savedInstanceState); 
     } 

     @Override 
     public void uncaughtException (Thread thread, Throwable ex) 
     { 
      //THIS DOESN'T WORK 

      //when global exception in activity is throws then this method is called. 
      Intent serviceIntent = new Intent(this, CService.class); 
      //method to service stop is called. BUT THIS METHOD DON'T CALL onDestroy in CService 
      stopService(serviceIntent); 
      defaultUEH.uncaughtException(thread, ex);  
     } 

     @Override 
     public void onDestroy() 
     { 
      //this work fine 
      Intent serviceIntent = new Intent(this, CService.class); 
      stopService(serviceIntent); 
      super.onDestroy(); 
      } 


    } 

當活動崩潰時,我需要停止後臺服務。當機器人關閉活動並在堆棧中啓動以前的活動(即登錄屏幕)時,Bacause現在不記錄用戶。

感謝您的建議。

+0

是您從另一個進程運行的服務嗎? –

+0

服務運行並停止在onCreate方法中運行的相同活動,並在uncaughtException方法中彎腰。 – Kamikazee

回答

2

試試這個

Thread.currentThread().setUncaughtExceptionHandler(this); 

UPD
這是默認的Android異常處理

private static class UncaughtHandler implements Thread.UncaughtExceptionHandler { 
     public void uncaughtException(Thread t, Throwable e) { 
      try { 
       // Don't re-enter -- avoid infinite loops if crash-reporting crashes. 
       if (mCrashing) return; 
       mCrashing = true; 

       if (mApplicationObject == null) { 
        Slog.e(TAG, "*** FATAL EXCEPTION IN SYSTEM PROCESS: " + t.getName(), e); 
       } else { 
        Slog.e(TAG, "FATAL EXCEPTION: " + t.getName(), e); 
       } 

       // Bring up crash dialog, wait for it to be dismissed 
       ActivityManagerNative.getDefault().handleApplicationCrash(
         mApplicationObject, new ApplicationErrorReport.CrashInfo(e)); 
      } catch (Throwable t2) { 
       try { 
        Slog.e(TAG, "Error reporting crash", t2); 
       } catch (Throwable t3) { 
        // Even Slog.e() fails! Oh well. 
       } 
      } finally { 
       // Try everything to make sure this process goes away. 
       Process.killProcess(Process.myPid()); 
       System.exit(10); 
      } 
     } 
    } 

我相信你沒有得到的onDestroy()調用,因爲默認的Android異常處理程序簡單地破壞整個過程System.exit()。你可以嘗試不調用defaultUEH.uncaughtException(thread,ex);或者稍後(如果)您的服務遭到破壞後再打電話。

+0

這不起作用。因爲setUncaughtExceptionHandler(this);是staic方法和currentThread()不是靜態方法。但謝謝你的回覆 – Kamikazee

+0

setUncaughtExceptionHandler不是靜態的http://korniltsev.ru/g/40 –

+1

setDefaultUncaughtExceptionHandler是靜態的 –

1

老兄,順便說一句,爲什麼你在onCreate方法中執行你的操作? 由於文件說這種方法是從主線程調用的,我真的想知道它是如何工作的。你應該從另一個線程做任何繁重的計算。

http://developer.android.com/reference/android/app/Service.html

當服務組件被實際創建的,任一這些 原因,所有的系統實際上確實是實例化 組件並調用它的onCreate()和任何其他適當的回調 主線程。這是由服務實施這些與 適當的行爲,如創建一個輔助線程,其中 它的工作。

+0

對不起,當我發佈問題在這裏,因爲我從onStartCommand而不是onCreate運行服務。我糾正了第一篇文章並糾正了問題。我不會複製粘貼到問題中,當我編寫代碼時,我會執行錯誤。而我使用另一個線程來防止android摧毀服務。 – Kamikazee