我正在尝试为我的应用程序添加一个自定义快速设置磁贴。我遵循了Google的示例代码/文档,但是遇到了一些问题。经过一段时间的搜索,我找不到任何解决方案。
当我运行我的应用程序时,该磁贴在快速设置托盘中可见,但仍处于不可用状态。
我需要与图块进行双向通信,即,当用户选择图块时,应用程序会做出响应,而当用户在应用程序内执行特定操作时,会切换图块UI。
问题似乎出在试图将我的自定义TileService
类绑定到我的类上时MainActivity
-每当我绑定它时,都是当磁贴进入一致的不可用状态时。我似乎不知道为什么会这样,因为它已成功绑定。如果我不绑定它(即,只有一种命令应用程序进行平铺通信),则该平铺处于活动状态,并且应用程序会响应选择它。
最终,我进行绑定以获得对自定义TileService
类的引用,以便能够调用它的method toggleTileUI()
。我不希望使用单例或静态成员变量作为获取对我的服务的引用的解决方案。
这是我的东西AndroidManifest.xml
:
<service
android:name=".ConnectionQuickSettingsService"
android:label="@string/quick_setting_tile_connect"
android:icon="@drawable/tile_icon"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
这是我的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()
地位,这阻碍了Android的TileService
实现onBind()
,从而阻碍了Android与您的Linux协同工作ConnectionQuickSettingsService
。我希望系统中的抱怨此消息的LogCat中会出现错误消息。
问题的另一部分是,您假定它getQsTile()
可以在任意时间点工作。不会的。
我建议您与图块查找其他交互模式,例如使用META_DATA_ACTIVE_TILE
和requestListeningState()
,并摆脱您的Binder
andonBind()
方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句