Android-快速设置-Quick settings tile
来源:互联网 发布:淘宝店铺托管收费 编辑:程序博客网 时间:2024/06/10 04:16
Android7.0的Quick settings tile
在Android7.0之后,任何程序都可以设置屏幕顶部下拉的设置了,为应用的快捷设置提供了极大的方便。
什么是优秀的快速设置
什么设置适合作为Quick settings tile,有两个关键要素:紧迫性和高频。
大家注意,因为这是一个常驻的设置,所以并不适合那些一次性的设置。
添加TileServuce
咱们首先需要定义一个继承TileService的服务,TileService是一个特殊的服务,在7.0系统中会自动识别并开启,这也就解决了低版本适配的问题。然后和其他的自定义服务一样,需要在manifest中配置:
<service android:name=".AwesomeTileService" android:icon="@drawable/ic_tile_default" android:label="快速设置" android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"> <intent-filter> <action android:name="android.service.quicksettings.action.QS_TILE"/> </intent-filter></service>
这里咱们需要配置Tile的名字,icon。以及对应的permission.
Tile多余18个字符会被截断,icon需要使用一张透明背景的白色矢量图,图片的着色是由当前系统决定的。
Tile生命周期
我们可以实现TileService的几个生命周期函数:
public class QuickSettingService extends TileService{ //当用户从Edit栏添加到快速设置中调用 @Override public void onTileAdded() { Log.d(LOG_TAG, "onTileAdded"); } //当用户从快速设置栏中移除的时候调用 @Override public void onTileRemoved() { Log.d(LOG_TAG, "onTileRemoved"); } // 点击的时候 @Override public void onClick() { Log.d(LOG_TAG, "onClick"); } // 打开下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用 //在TleAdded之后会调用一次 @Override public void onStartListening () { Log.d(LOG_TAG, "onStartListening"); } // 关闭下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用 // 在onTileRemoved移除之前也会调用移除 @Override public void onStopListening () { Log.d(LOG_TAG, "onStopListening"); }}
主动调用
如果咱们需要在非点击情况下改变Tile的状态,可以将Tile的Mode改为主动模式:
<service... <meta-data android:name="android.service.quicksettings.ACTIVE_TILE" android:value="true" /></service>
可以在程序中的其他地方调用TileService.requestListeningState() 来触发 onStartListening函数
更新UI
如下代码:
public class QuickSettingService extends TileService { private final String LOG_TAG = "QuickSettingService"; //当用户从Edit栏添加到快速设定中调用 @Override public void onTileAdded() { Log.d(LOG_TAG, "onTileAdded"); } //当用户从快速设定栏中移除的时候调用 @Override public void onTileRemoved() { Log.d(LOG_TAG, "onTileRemoved"); } // 点击的时候 @Override public void onClick() { int state = getQsTile().getState(); Log.d(LOG_TAG, "onClick state = " + Integer.toString(getQsTile().getState())); Icon icon; if (state == Tile.STATE_INACTIVE) { icon = Icon.createWithResource(getApplicationContext(), R.drawable.activeon); getQsTile().setState(Tile.STATE_INACTIVE);// 更改成非活跃状态 } else { icon = Icon.createWithResource(getApplicationContext(), R.drawable.add_photo); getQsTile().setState(Tile.STATE_ACTIVE);//更改成活跃状态 } getQsTile().setIcon(icon);//设置图标 getQsTile().updateTile();//更新Tile } // 打开下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用 //在TleAdded之后会调用一次 @Override public void onStartListening() { Log.d(LOG_TAG, "onStartListening"); } // 关闭下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用 // 在onTileRemoved移除之前也会调用移除 @Override public void onStopListening() { Log.d(LOG_TAG, "onStopListening"); }}
我们可以通过getQsTile来获得Tile对象,通过getState() 来获得Tile当前状态。
- STATE_ACTIVE 开启状态
- STATE_INACTIVE 关闭状态
- STATE_UNAVAILABLE 非可点击状态
最后必须调用updateTile() 来触发刷新。
事件处理
在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 来重载此行为。
参考文献
- Android-快速设置-Quick settings tile
- Android7.0 添加快速设定Quick Settings Tile
- Android Settings 快速搜索
- Android Settings 快速搜索
- Android Settings 声音设置
- quick在VS上运行,设置settings的参数
- android quick settings中去掉不需要的图标
- Android 7.0&8.0 Quick Settings 添加一个新项
- Android设置Settings:ListPreference【3】
- Android设置Settings:ListPreference【3】
- Android设置Settings实现:PreferenceActivity
- Android设置Settings:PreferenceFragment【4】
- Android设置Settings:ListPreference【3】
- Android设置Settings实现:PreferenceActivity
- Android设置Settings:PreferenceFragment【4】
- Android系统Settings设置模块
- Qss -- quick seceruy set 快速安全设置
- Ubuntu Quick Settings
- 多线程编程时临界区、互斥量、信号量和事件的差异
- ubuntu12.04中shibboleth布署
- js取消默认事件和事件绑定
- 如何解决 case expressions must be constant expressions
- Genymotion 无法安装应用解决
- Android-快速设置-Quick settings tile
- Generate Parentheses
- 基础类库:DateFormat、SimpleDateFormat类
- XML的三种解析方式与JSON解析方式
- Leetcode 111 Minimum Depth of Binary Tree
- 修改Nodejs内置的npm默认配置路径
- unused import statement解决方法
- java基础之异常
- apache多SSL证书虚拟主机使用mod_jk方式代理tomcat