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加上android.service.quicksettings.action.QS_TILE_PREFERENCES来重载此行为:

     <activity android:name=".MainActivity" >
           <intent-filter>
                 <action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES"/>
           </intent-filter>
     </activity>
  • 此Service与其他Service可通过绑定服务进行交互,也可使用广播做交互。

完。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值