You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 7.1.2:启用ACTIVE_TILE后开机Tile默认ACTIVE状态的问题求解

解决Android 7.1.2 Quick Settings Tile开机状态异常问题

针对你遇到的使用META_DATA_ACTIVE_TILE时,开机后Tile一直保持ACTIVE状态直至用户点击的问题,我整理了几个适配Android 7.1.2的可行方案:

方案1:监听开机广播,主动触发Tile状态更新

Android 7.1.2中,设置了ACTIVE_TILE的Tile在开机后会默认处于ACTIVE状态,但系统不会自动触发onStartListening()来更新状态。我们可以通过监听开机完成广播,主动请求TileService开始监听,从而触发状态校正:

  1. 添加权限与广播接收器
    在AndroidManifest.xml中添加开机权限和静态广播接收器:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver android:name=".BootCompletedReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" /> <!-- 适配部分设备的快速开机逻辑 -->
    </intent-filter>
</receiver>
  1. 实现广播接收器逻辑
    创建广播接收器类,在开机完成后请求TileService开始监听:
public class BootCompletedReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_BOOT_COMPLETED.equals(action) || 
            "android.intent.action.QUICKBOOT_POWERON".equals(action)) {
            // 指定你的TileService组件
            ComponentName tileComponent = new ComponentName(context, YourCustomTileService.class);
            // 请求系统触发TileService的onStartListening回调
            TileService.requestListeningState(context, tileComponent);
        }
    }
}

方案2:在TileService中动态校正状态

不管开机时Tile的默认状态是什么,我们可以在onStartListening()回调中根据业务逻辑动态设置Tile的正确状态:

public class YourCustomTileService extends TileService {
    @Override
    public void onStartListening() {
        super.onStartListening();
        // 替换为你的实际判断逻辑:比如检查后台服务状态、开关配置等
        boolean shouldTileBeActive = checkTileActiveCondition();

        Tile tile = getQsTile();
        if (tile != null) {
            // 根据判断结果设置Tile状态
            tile.setState(shouldTileBeActive ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE);
            // 提交状态更新
            tile.updateTile();
        }
    }

    // 示例判断方法,根据你的需求自定义
    private boolean checkTileActiveCondition() {
        // 比如:检查某个后台服务是否正在运行
        Intent serviceIntent = new Intent(this, YourBackgroundService.class);
        return isServiceRunning(serviceIntent);
    }

    private boolean isServiceRunning(Intent serviceIntent) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceIntent.getComponent().equals(service.service)) {
                return true;
            }
        }
        return false;
    }
}

方案3:移除静态ACTIVE_TILE配置(可选)

如果你的Tile不需要默认开机处于ACTIVE状态,可以直接删除Manifest中META_DATA_ACTIVE_TILE的配置:

<!-- 移除这一行 -->
<meta-data android:name="android.service.quicksettings.ACTIVE_TILE" android:value="true" />

这样开机时Tile会默认保持INACTIVE状态,再通过方案1的开机广播触发onStartListening(),由你的业务逻辑来设置最终状态。

注意事项

  • Android 7.1.2中,getQsTile()在极少数情况下可能返回null,务必添加非空判断避免崩溃。
  • 部分定制ROM可能会限制开机广播的接收,你可以测试后调整为动态注册广播(在Tile被添加时注册,移除时注销)。

内容的提问来源于stack exchange,提问作者br.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:44:09