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(); 
    } 
} 

我选择这个是因为我发现它是一个非常简单和高性能的选择。