绑定到活动时,自定义快速设置平铺仍处于不可用状态

时间:2016-09-20 15:52:03

标签: java android

我正在尝试为我的应用添加自定义快速设置磁贴。我已经关注了Google的示例代码/文档,但我遇到了一些问题。经过一段时间的搜索,我无法找到任何解决方案。

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

我需要与磁贴的双向通信流,即,当用户选择磁贴时,应用响应,并且当用户在应用内执行特定动作时,切换磁贴UI。

问题似乎来自于尝试将我的自定义TileService类绑定到我的MainActivity - 每当我绑定它时,磁贴进入始终不可用的状态。我似乎无法弄明白为什么,因为它被成功约束。如果我没有绑定它(即只是让瓷砖的单向通信命令应用程序),则磁贴处于活动状态,应用程序会响应选择它。

最终我执行绑定以获得对我的自定义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();
    }
}

非常感谢任何输入,谢谢!

2 个答案:

答案 0 :(得分:2)

您的部分问题在于,您要覆盖onBind(),这会导致TileService实施onBind(),从而阻止Android与您的ConnectionQuickSettingsService合作。我希望LogCat中的错误消息会从系统进程抱怨这个。

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

我建议您在平铺中找到其他一些互动模式,例如使用META_DATA_ACTIVE_TILErequestListeningState(),以及摆脱BinderonBind()方法。

答案 1 :(得分:1)

我认为您不需要所有服务连接。我会将元数据META_DATA_ACTIVE_TILE添加到磁贴服务清单声明中,然后您可以调用TileService.requestListeningState(context, new ComponentName(context, TileService.class));来触发onStartListening()。 之后onStartListening()可以调用方法来更新Tile状态/标签/图标。

另外在你的Tile服务方法中更新磁贴 我会添加一个检查if(getQsTile!= null)