我使用以下代码开始了一项活动:
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()
上,将检查该标志,如果包含该标志,则活动将结束。
这种方法对我来说并不合适,因为意图应该用于开始活动而不是阻止它们。
有人知道如何实现这个目标吗?
答案 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();
}
}
我选择了这个,因为我发现它是一个非常简单和高性能的替代品。