我正在尝试为我的应用程序添加自定义快速设置磁贴.我已经关注了Google的示例代码/文档,但我遇到了一些问题.搜索了一段时间后,我找不到任何解决方案.
当我运行我的应用程序时,瓷砖在快速设置托盘中可见,但它仍处于不可用状态.
我需要与瓦片的双向通信流程,即,当用户选择瓦片时,应用程序响应,并且当用户在应用程序内执行特定动作时,切换瓦片UI.
问题似乎来自于尝试将我的自定义TileService类绑定到我的MainActivity – 每当我绑定它时,tile都会进入一直不可用的状态.我似乎无法弄清楚为什么,因为它被绑定成功.如果我没有绑定它(即只是让命令应用程序的磁贴的单向通信),则磁贴处于活动状态,应用程序响应选择它.
最后,我进行绑定以获得对我的自定义TileService类的引用,以便能够调用它的方法toggleTileUI().我不打算使用单例或静态成员变量作为获取对我的服务的引用的解决方案.
这是我的ConnectionQuickSettingsService.java:
@TargetApi(24)
public class ConnectionQuickSettingsService extends TileService {
private static final String TAG = "ConnectionQuickSettingsService";
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
ConnectionQuickSettingsService getService() {
return ConnectionQuickSettingsService.this;
}
}
@Override
public IBinder onBind(Intent i) {
return mBinder;
}
@Override
public void onTileAdded() {
L.d(TAG,"onTileAdded()");
}
@Override
public void onStartListening() {
L.d(TAG,"onStartListening()");
}
@Override
public void onClick() {
L.d(TAG,"Quick Settings tile selected");
toggleInAppSwitch();
toggleTileUI();
}
private void toggleInAppSwitch() {
doStuff();
}
public void toggleTileUI() {
Tile tile = this.getQsTile();
doStuffWithTile();
}
}
最后(我的MainActivity.java的相关部分):
@Override
protected void onStart() {
super.onStart();
Intent i = new Intent(this,ConnectionQuickSettingsService.class);
bindService(i,mConnection,Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
if (mBound) {
unbindService(mConnection);
mBound = false;
}
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,IBinder service) {
ConnectionQuickSettingsService.LocalBinder binder = (ConnectionQuickSettingsService.LocalBinder) service;
mQSService = binder.getService();
mBound = true;
L.d(TAG,"Bound to QS service successfully");
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
L.d(TAG,"Disconnected from QS service");
}
};
public void onOnOff(){
L.d(TAG,"On/Off switch toggled");
if (mBound) {
mQSService.toggleTileUI();
}
}
任何意见都将非常感谢,谢谢!
最佳答案
你的部分问题是你要重写onBind(),这会破坏onBind()的TileService实现,阻止Android使用你的ConnectionQuickSettingsService.我希望LogCat中的错误消息会从系统进程抱怨这一点.
原文链接:https://www.f2er.com/android/430057.html你的问题的另一部分是你假设getQsTile()在任意时间点工作. It doesn’t.
我建议在你的磁贴上找到一些其他的交互模式,比如使用Meta_DATA_ACTIVE_TILE和requestListeningState(),并删除你的Binder和onBind()方法.