0

開始,我開始從我的服務下面的代碼的活動:最佳替代品從服務

Intent cmActivityIntent = new Intent(getApplicationContext(), CallManagementActivity.class); 
cmActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(cmActivityIntent); 

在應用程序的清單活動的launchMode被定義爲android:launchMode="singleTask"

我一直在尋找停止服務的onDestroy()活動的方法,但我一直沒能找到任何可以幫助我的文檔。我只找到了一種方法。

我已經看到了檢查service的方法,如果使用activity-class-static-property(public static boolean isInstanced)實例化活動,並且發送另一個意圖到FINISH_ACTIVITY多餘的活動(如果是)。然後,在活動的onNewIntent()上,將檢查該標誌,並且如果該標誌被包括,則該活動將被完成。

這種方法對我來說並不合適,因爲意圖應該用於開始活動而不是阻止它們。

有人知道如何實現這一點的任何其他方式嗎?已獲得

+0

廣播將工作,與接收器在活動中。或者,該活動可以綁定到該服務,將其傳遞給一個信使,並且該服務將使用該信使將命令傳遞給該活動。 – njzk2

+1

'LocalBroadcastManager'或類似'Otto'的事件總線應該能夠做到,然後在事件上調用'finish()'。 – EpicPandaForce

+0

@ njzk2你可以發佈綁定替代方案作爲一個解決方案與示例代碼來嘗試它,看看它的工作原理? – Storo

回答

0

許多替代方案來解決這個問題:

  • 使用Intent並設置Extra
  • 發送來自Service的廣播目的並在Activity上註冊BroadcastReceiver
  • 使用LocalBroadcastManager(類似於前面的替代)
  • 綁定ActivityService,並將它傳遞一個Messenger所以Service可以使用它與Activity通信。

他們都沒有我找到了一個很好的解決方案,事實上,因爲服務是從包中只有入店,我與堅持的解決方案是Observer Pattern

接下來,您會看到我使用的代碼。這些活動實現Observer接口(我自己的)和服務的抽象類ObservableService。

ObservableService:

public abstract class ObservableService extends Service { 

@Override 
public void onCreate() { 
    super.onCreate(); 
    serviceStarted = true; 
    observers = new ArrayList<Observer>(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    serviceStarted = false; 
} 

//--------------------------------------------------------- 
// 
// Singleton methods 
// 
//--------------------------------------------------------- 

/** 
* Flag set to <code>true</code> if the service is running and 
* <code>false</code> if not. 
*/ 
private static boolean serviceStarted; 

/** 
* Used to check if the service is started. 
* @return <code>true</code> if the service is running and <code>false</code> 
* if not. 
*/ 
public static boolean isServiceStarted() { 
    return serviceStarted; 
} 

//--------------------------------------------------------- 
// 
// Observable methods an constants 
// 
//--------------------------------------------------------- 

/** 
* Used to notify the observers that the service has been stopped. 
*/ 
public static String UPDATE_TYPE_SERVICE_STOPPED = "service_stopped"; 


protected static ArrayList<Observer> observers; 


public static void addObserver(Observer observer) { 
    observers.add(observer); 
} 

public static void removeObserver(Observer observer) { 
    observers.remove(observer); 
} 

protected static void notifyObservers(String updateType) { 
    for (Observer observer : observers) { 
     observer.onObservableUpdate(updateType); 
    } 
} 

}

觀察報:

public interface Observer { 

    public void onObservableUpdate(String updateType); 

} 

活動只登記自己作爲觀察者的onResume()和註銷的onPause()。如果服務已停止,則使用isServiceStarted()完成活動。

@Override 
protected void onResume() { 
    super.onResume(); 

    if (InCallService.isServiceStarted()) { 
     InCallService.addObserver(this); 
    } else { 
     this.finish(); 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    InCallService.removeObserver(this); 
} 

public void onObservableUpdate(String updateType) { 
    if (updateType.equals(ObservableService.UPDATE_TYPE_SERVICE_STOPPED)) { 
     this.finish(); 
    } 
} 

我選擇這個是因爲我發現它是一個非常簡單和高性能的選擇。