三方应用如何在SystemUI快捷设置中添加快捷开关

功能介绍

安装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.部分手机显示出快捷设置无法点击,不清楚什么原因,在小米,联想上是可以的,可能这个功能不常用,所以有点厂商没有验证好自己的软件.

发布了67 篇原创文章 · 获赞 42 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/w1764662543/article/details/90753202