Android7.0快捷图标:Quick Settings Tile

实现效果:

  

其实很简单,实现过程:

1、写一个服务继承TileService,里面实现四个方法:

public class MyTileService extends TileService {

    final String LOG_TAG = "MyTileService";

    @Override
    public void onTileAdded() {
        //当用户从Edit栏添加到快速设置中调用
        Log.d(LOG_TAG, "onTileAdded");
    }

    @Override
    public void onTileRemoved() {
        //当用户从快速设置栏中移除的时候调用
        Log.d(LOG_TAG, "onTileRemoved");
    }

    @Override
    public void onClick() {
        // 点击的时候
        Log.d(LOG_TAG, "onClick");

        int state = getQsTile().getState();
        if (state == Tile.STATE_INACTIVE) {
            // 更改成非活跃状态     (还有一个参数:STATE_UNAVAILABLE 非可点击状态)
            getQsTile().setState(Tile.STATE_ACTIVE);
        } else {
            //更改成活跃状态
            getQsTile().setState(Tile.STATE_INACTIVE);
        }

        //可以点击设置图标,设置方式如下:
        //Icon icon = Icon.createWithResource(getApplicationContext(), R.drawable.xxxx);
        //getQsTile().setIcon(icon);
        //设置label:
        //getQsTile.setLabel("");

        //更新Tile
        getQsTile().updateTile();
    }

    @Override
    public void onStartListening () {
        // 打开下拉通知栏的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用
        //在TleAdded之后会调用一次
        Log.d(LOG_TAG, "onStartListening");
    }

    @Override
    public void onStopListening () {
        // 关闭下拉通知栏的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用
        // 在onTileRemoved移除之前也会调用移除
        Log.d(LOG_TAG, "onStopListening");
    }
}

2、AndroidManifest.xml里面注册服务:

<service android:name=".MyTileService"
    android:label="朗读悬浮窗"
    android:icon="@drawable/isay_icon"
    android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
    <intent-filter>
        <action android:name="android.service.quicksettings.action.QS_TILE"/>
    </intent-filter>
</service>

说明:

  • 图标需要一个白色前景+透明背景的图标,它自动会给你设置开关颜色。Title多余18个字符会被截断

  • 可以在程序中的其他地方调用TileService.requestListeningState() 来触发 onStartListening函数

  • 如果想要一开始就是打开状态,可以将Tile的Mode改为主动模式:

<service>
...
  <meta-data
    android:name="android.service.quicksettings.ACTIVE_TILE"
    android:value="true" />
</service>
  • 在OnClick() 中,我们可以在UI线程上处理业务逻辑,耗时操作请交给另一个线程或IntentService执行。

  • 其中我们可以开启Dialog或通过startActivityAndCollapse()开启一个Actvitiy。

  • 但是在锁屏,也就是isLocked()返回true时,将不能打开Dialog,而Activity则需要增加FLAG_SHOW_WHEN_LOCKED这个Flag。

  • 我们也可以使用unlockAndRun(Runnable) 来异步设置用户解锁后的工作。

  • 用户长按Tile会默认打开app的app info页面,我们可以给Activity加上ACTION_QS_TILE_PREFERENCES 来重载此行为。

  • 此Service与其他Service可通过绑定服务进行交互,也可使用广播做交互。

完。

发布了60 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_35584878/article/details/100553155