gpt4 book ai didi

java - 自定义快速设置磁贴在绑定(bind)到 Activity 时保持不可用状态

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:52:04 24 4
gpt4 key购买 nike

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

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

我需要与磁贴进行双向通信,即当用户选择磁贴时,应用会做出响应,而当用户在应用内执行特定操作时,磁贴 UI 会切换。

问题似乎来自尝试将我的自定义 TileService 类绑定(bind)到我的 MainActivity - 每当我绑定(bind)它时,tile 就会进入持续不可用状态。我似乎无法弄清楚为什么,因为它已成功绑定(bind)。如果我不绑定(bind)它(即只有命令应用程序的图 block 的单向通信),图 block 处于 Activity 状态并且应用程序响应选择它。

最终,我进行绑定(bind)以获得对我的自定义 TileService 类的引用,以便能够调用它的方法 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(),这破坏了 onBind()TileService 实现,阻止了 Android使用您的 ConnectionQuickSettingsService。我希望系统进程在 LogCat 中出现错误消息对此进行提示。

问题的另一部分是您假设 getQsTile() 在任意时间点工作。 It doesn't .

我建议找到一些其他与磁贴的交互模式,例如使用 META_DATA_ACTIVE_TILErequestListeningState(),并摆脱您的 BinderonBind() 方法。

关于java - 自定义快速设置磁贴在绑定(bind)到 Activity 时保持不可用状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39598641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com