Java 自定义快速设置磁贴在绑定到“活动”时仍处于不可用状态

Java 自定义快速设置磁贴在绑定到“活动”时仍处于不可用状态,java,android,Java,Android,我正在尝试为我的应用程序添加自定义快速设置磁贴。我遵循了谷歌的示例代码/文档,但遇到了一些问题。搜索了一段时间后,我找不到任何解决方案 当我运行我的应用程序时,互动程序在快速设置托盘中可见,但它仍处于不可用状态 我需要与互动程序进行双向通信,即,当用户选择互动程序时,应用程序响应,当用户在应用程序中执行特定操作时,互动程序UI切换 问题似乎来自于试图将我的自定义TileService类绑定到我的MainActivity——每当我绑定它时,tile就会进入持续不可用的状态。我似乎不明白为什么,因为

我正在尝试为我的应用程序添加自定义快速设置磁贴。我遵循了谷歌的示例代码/文档,但遇到了一些问题。搜索了一段时间后,我找不到任何解决方案

当我运行我的应用程序时,互动程序在快速设置托盘中可见,但它仍处于不可用状态

我需要与互动程序进行双向通信,即,当用户选择互动程序时,应用程序响应,当用户在应用程序中执行特定操作时,互动程序UI切换

问题似乎来自于试图将我的自定义
TileService
类绑定到我的
MainActivity
——每当我绑定它时,tile就会进入持续不可用的状态。我似乎不明白为什么,因为它被成功绑定了。如果我没有绑定它(即,只有互动程序的单向通信命令应用程序),互动程序将处于活动状态,应用程序将响应选择它

最终,我进行绑定以获得对自定义
TileService
类的引用,从而能够调用其方法
toggleTileUI()
。我不希望使用单例变量或静态成员变量作为获取对我的服务的引用的解决方案

以下是我的
AndroidManifest.xml中的内容:


这是我的
连接QuickSettingsService.java

@TargetApi(24)
公共类连接QuickSettingsService扩展TileService{
私有静态最终字符串TAG=“ConnectionQuickSettingsService”;
private final IBinder mBinder=new LocalBinder();
公共类LocalBinder扩展了Binder{
ConnectionQuickSettingsService getService(){
返回ConnectionQuickSettingsService.this;
}
}
@凌驾
公共IBinder onBind(意向一){
返回mBinder;
}
@凌驾
已添加公共void ontiled(){
L.d(标签“onTileAdded()”);
}
@凌驾
公共void onStartListening(){
L.d(标签“onStartListening()”);
}
@凌驾
公共void onClick(){
L.d(标记“选择快速设置块”);
切换InAppSwitch();
toggleTileUI();
}
私有无效切换InAppSwitch(){
doStuff();
}
public void toggleTileUI(){
Tile Tile=this.getQsTile();
dostufwithtile();
}
}
最后是my
MainActivity.java的相关部分:

@覆盖
受保护的void onStart(){
super.onStart();
意向i=新意向(此,ConnectionQuickSettingsService.class);
bindService(i、mConnection、Context.BIND\u AUTO\u CREATE);
}
@凌驾
受保护的void onStop(){
super.onStop();
如果(mBound){
解除绑定服务(mConnection);
mBound=假;
}
}
专用ServiceConnection mConnection=新ServiceConnection(){
@凌驾
ServiceConnected上的公共无效(ComponentName类名称,
IBinder服务){
ConnectionQuickSettingsService.LocalBinder=(ConnectionQuickSettingsService.LocalBinder)服务;
mQSService=binder.getService();
mBound=true;
L.d(标签“成功绑定QS服务”);
}
@凌驾
ServiceDisconnected上的公共无效(组件名称arg0){
mBound=假;
L.d(标签“与QS服务断开”);
}
};
公开无效onOnOff(){
L.d(标签“开关切换”);
如果(mBound){
mQSService.toggleTileUI();
}
}

如有任何意见,将不胜感激,谢谢

问题的一部分是您正在重写
onBind()
,这会破坏
onBind()
TileService
实现,从而阻止Android使用您的
连接QuickSettingService
。我希望LogCat中会有来自系统进程的错误消息对此进行抱怨

问题的另一部分是,您假设
getQsTile()
在任意时间点工作


我建议您在互动程序中找到其他一些交互模式,例如使用
META\u ACTIVE\u互动程序
requestListeningState()
,并摆脱
活页夹
onBind()
方法。

我认为您不需要所有的服务连接。我会将元数据添加到tile服务清单声明中,然后您可以调用哪个将触发。 在此之后,onStartListening()可以调用一个方法来更新磁贴状态/标签/图标

也可以在磁贴服务方法中更新磁贴
如果我删除了
活页夹和
onBind()
,我会添加一个检查(getQsTile!=null)

,那么我的
main活动如何获得对
TileService
的引用,这样我就可以调用
toggleTileUI()
?@jcarnide:你可以摆脱所有这些
toggleTileUI()
将不起作用,因为您不能在任何时候调用
getQsTile()
。我建议您在互动程序中找到其他一些交互模式,例如使用
META\u-DATA\u-ACTIVE\u-tile
requestlistingstate()
。可能我没有正确理解。我知道互动程序并非总是通过
getQsTile()
可用,使用
META\u-DATA\u-ACTIVE\u互动程序
requestListeningState()
可以使其处于活动状态以供使用,但这并不能解决我的
main活动如何与互动程序通信的问题。互动程序用户界面需要与应用程序内用户界面同步(用于打开和关闭功能),即,如果应用程序中的开关打开,互动程序需要“打开”并设置适当的标签等。@jcarnide:
MainActivity
调用
requestListeningState()
。您的
tile服务在
之后的某个时间更新tile