功能介绍
安装v2rayNg后,android的快捷设置中会有一个快捷开关,以前添加开关都是在SystemUI里面处理的,对于三方应用,SystemUI不能可能事先内置,只可能是SystemUI提供的接口,让开发者能够在SystemUi里面添加这个开关.在android的setting的开发者模式中,有一个Quick setting developer tiles选项,里面有多个调试的开关,打开他们,在SystemUI里面也会出现新的开关,可见Systemui早就提供了相应的接口.这个功能在原生android 8 和 android 9上是有的
功能实现
跟以前动态壁纸一样,这种跨进程的接口一般都是通过服务实现的.实现三方快捷开关的服务类是TileService.java
定义AndroidManinfest.xml
<service
android:name=".QsControlService"
android:enabled="true"
android:icon="@drawable/ic_launcher_foreground"
android:label="@string/app_name"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
如果 android:enabled=“true”,表示可以实例化,否则需要通过packagemanager在代码中enable.
定义实现类
import android.content.Intent;
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
import android.util.Log;
public class QsControlService extends TileService {
private static final String TAG = "QsControlService";
@Override
public void onStartListening() {
super.onStartListening();
refresh();
}
public void refresh() {
final int state;
state = Tile.STATE_ACTIVE;
getQsTile().setState(state);
getQsTile().updateTile();
}
@Override
public void onClick() {
Log.i(TAG, "onClick");
//没有mHost对象,不知道怎么卷起通知栏;mHost.collapsePanels();
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
refresh();
}
}
虽然实现类是一个服务,但是不需要启动它.定义好之后,定义上面两处代码就直接会在SystemUI快捷设置下的编辑区域找到它了.
显示控制(一般不用)
如果需要在用户执行某个操作之后才让快捷开关显示在SystemUI里面,需要在AndroidManinfest.xml中设置该service的enbale为false
android:enabled=“false”
<service
android:name=".DevelopmentTiles$ShowLayout"
android:enabled="false"
android:icon="@drawable/tile_icon_show_layout"
android:label="@string/debug_layout"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
然后在代码里面控制
//查找定义的那个Service,得到serviceinfo
List<ResolveInfo> resolveInfos = mPackageManager.queryIntentServices(intent,PackageManager.MATCH_DISABLED_COMPONENTS);
ServiceInfo sInfo = resolveInfos.get(0).serviceInfo;
//激活或失之失效这个service
ComponentName componentName = new ComponentName(PackageName, sInfo.name);
mPackageManager.setComponentEnabledSetting(componentName, enabled
? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
SystemUI添加图标
SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java的addPackageTiles方法添加三方快捷开关.如果应用卸载后,会在SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java删除快捷图标.
1.有一点问题:TilesService无法获取TilesHost对象,这个对象可以卷起SystemUI的通知栏,SytstemUI就是利用它,
2.部分手机显示出快捷设置无法点击,不清楚什么原因,在小米,联想上是可以的,可能这个功能不常用,所以有点厂商没有验证好自己的软件.