我的问题是非常直接的,我不知道如何从我的服务中修改当前活动窗口的属性。
我不知道如何从我的服务中修改当前活动窗口的属性.我在堆栈上看到了一些帖子,也在其他地方看到了,但没有一个真正的答案.前台(活动)活动可以是任何东西。我无权访问它。
这个家伙似乎问了同样的问题,但没有得到答案......如何获得前台活动实例?
Many thanx in advance !
不幸的是,Android似乎不支持这样的需求,从后台运行的服务中修改顶部应用的窗口。
我发现这是目前最好的办法。
http:/developer.android.comguidecomponentsservices.html。
"向用户发送通知一旦运行,服务可以使用吐司通知或状态栏通知来通知用户事件。
吐司通知是指在当前窗口表面出现片刻然后消失的消息,而状态栏通知则是在状态栏中提供了一个带有消息的图标,用户可以选择该图标来进行操作(如启动活动)。
通常,当一些后台工作已经完成(如一个文件完成下载),用户现在可以采取行动时,状态栏通知是最好的技术。当用户从展开的视图中选择通知时,通知可以开始一个活动(如查看下载的文件)。
更多信息请参见Toast通知或状态栏通知开发者指南。"
可访问性服务提供了一种与前台服务交互的手段。这有点像一种变通方法,但仍然有效。 要利用这一点,扩展Accessibility Service并创建一个新类。监听 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 事件。每当前台活动发生变化时,该事件就会被触发。当前前台进程名称可从事件对象中获得。
AccessibilityService.java
public class AccessibilityService extends android.accessibilityservice.AccessibilityService{
public static AccessibilityService instance;
@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
// Note : This event is sometimes called more than one for a foreground service
if (accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
Log.d("Event","TYPE_WINDOW_STATE_CHANGED");
Log.d("Pkg",accessibilityEvent.getPackageName().toString());
// Check PackageName matching here and continue with code
// Here we prevent whatsapp from opening
// Each time it launches we simulate the press of back button
if (accessibilityEvent.getPackageName().equals("com.whatsapp")){
doAction();
}
}
}
@Override
public void onInterrupt() {
}
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Log.d("Accessibility","Service Connected");
}
public void doAction(){
performGlobalAction(GLOBAL_ACTION_BACK);
}
}
在这里我检查前台服务是否是Whatsapp,如果是的话再继续我的代码。
除了这个类,这个服务还必须在应用部分的manifest文件中声明,同时在resxml文件夹中声明一个配置文件。
<service android:name=".AccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/serviceconfig"/>
</service>
服务配置.xml
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagDefault"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
/>
同时确保用户允许访问服务权限。登录前台进程名称的示例应用的完整代码可在以下网址获得。https:/github.comabinpaul1Android-SnippetstreemasterGetForegroundService。