从服务开始停止活动的最佳替代方案

时间:2015-05-11 20:14:31

标签: android android-intent android-activity broadcastreceiver android-service

我使用以下代码开始了一项活动:

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

在应用的清单中,活动的launchMode定义为android:launchMode="singleTask"

我一直在寻找停止服务onDestroy()活动的方法,但我还没有找到任何可以帮助我的文档。我只找到了一种方法。

如果使用activity-class-static-property(public static boolean isInstanced)实例化活动并使用FINISH_ACTIVITY向活动发送另一个意图,我已经看到检查服务的方法如果它是额外的。然后,在活动onNewIntent()上,将检查该标志,如果包含该标志,则活动将结束。

这种方法对我来说并不合适,因为意图应该用于开始活动而不是阻止它们。

有人知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

已经有很多替代方案来解决这个问题:

  • 使用Intent并设置Extra
  • Service发送广播意图,并在BroadcastReceiver上注册Activity
  • 使用LocalBroadcastManager(与之前的替代方案类似)
  • Activity绑定到Service并传递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();
    }
}

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