在Android中,我想获得目前最活跃的活动名称。不推荐使用<TextBlock Text="{Binding AlertBoxMessage, Mode=OneWay, NotifyOnTargetUpdated=True}"
Name="AlertBox"
MinHeight="55"
FontWeight="Normal"
FontSize="16"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="Black">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<EventTrigger RoutedEvent="Binding.TargetUpdated">
<BeginStoryboard>
<Storyboard Storyboard.TargetProperty="Foreground.Color">
<ColorAnimation From="Black"
To="Red"
AutoReverse="True"
RepeatBehavior="3x"
Duration="0:0:2"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
等方法,用户应启用ActivityManager.getRunningTasks(1);
。因此我决定通过 RxJava 来做到这一点。基本上,我将有一个将持有主题的Singleton类。我将在活动恢复时和活动暂停时更新此主题。此外,我将从我的后台服务订阅此主题以获取当前正在运行的Activity。
我的问题是,如何在后台作业中同步获取当前活动名称。
主题持有人Singleton类ActivityTracker.class
AccessibilityService
VideoPlayerActivity.class
public class ActivityTracker {
private static ActivityTracker instance;
public static synchronized ActivityTracker getInstance() {
if (instance == null) {
instance = new ActivityTracker();
}
return instance;
}
public PublishSubject<String> currentActivity = PublishSubject.create();
}
答案 0 :(得分:1)
你不应该。您应该始终订阅并获取该名称作为onNext的一部分。如果你想这样做,你应该公开Subject asObservable,例如我的问题是,我应该如何同步获取当前的活动 在后工作中的名字。
public Observable<String> getActivityName() {
return currentActivity.asObservable();
}
从外面你可以做到:
ActivityTracker.getInstance().getActivityName().toBlocking().first();
toBlocking
会将您的Observable
转换为BlockingObservable
,而first
会阻止执行,直到发出第一个项目
我强烈建议您阅读主题类型之间的差异。如果我在你身边,我会使用BehaviourSubject