Android 13 Settings添加独立单选页面,并被其他app调用


前言

在settings里单独添加一个activity来实现的方法就不说了,我这里主要是在settings列表添加一个Preference,extends RadioButtonPickerFragment来实现,然后在其他应用地方调用时,用activity套壳跳转来实现。


一、主要实现功能

添加一列RadioButton单选,选择后实现相应功能。我做的是实现battry mode的相关功能,这里就以此为例。

二、实现步骤

1.添加settings列表条目

在想要添加功能条目的相应的setting的xml里添加对应的Preference

<Preference
        android:key="charging_mode"
        android:title="@string/charging_state" 
        android:fragment="com.android.settings.fuelgauge.batterysaver.BatteryChargingState"/>

2.添加BatteryChargingState

代码如下(示例):

package com.android.settings.fuelgauge.batterysaver;

import com.android.settings.R;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.widget.CandidateInfo;
import android.graphics.drawable.Drawable;
import android.app.settings.SettingsEnums;
import android.content.Context;
import java.util.ArrayList;
import java.util.List;
import android.util.Log;
import android.os.UserHandle;
import android.provider.Settings;
import android.os.SystemProperties;


/**
 * author : suntianhai
 * e-mail : tianhai.sun@t2mobile.com
 * time   : 2023/08/1
 * desc   : add for set Battery Charging mode 
 * version: 1.0
 * 
 */
public class BatteryChargingState extends RadioButtonPickerFragment {
	private static final String TAG = "BatteryChargingState";


    // charging_slow  charging_normal
    private String[] mEntries;

    // 1  0
    private String[] mValues;
    
    public BatteryChargingState() { }

    @Override
    public int getMetricsCategory() {
        return SettingsEnums.BATTERY_CHARGING_STATE;
    }

    @Override
    protected int getPreferenceScreenResId() {
        return R.xml.battery_charging_state_settings;
    }

    @Override
    protected List<? extends CandidateInfo> getCandidates() {
        final List<CandidateInfo> candidates = new ArrayList<>();

        if (mEntries == null || mValues == null) {
            return candidates;
        }

        for (int i = 0; i < mValues.length; i++) {
            candidates.add(new ChargingStateCandidateInfo(mEntries[i], mValues[i], true));
        }

        return candidates;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mEntries = getContext().getResources().getStringArray(
                R.array.charging_mode);
        mValues = getContext().getResources().getStringArray(
                R.array.charging_mode_value);
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    protected String getDefaultKey() {
        return mValues[0];
    }

    @Override
    public void onStop() {
        super.onStop();
    }

    @Override
    protected boolean setDefaultKey(String key) {
        String charge_mode = SystemProperties.get("persist.sys.charge_mode");
        switch (key) {
            case "0"://slow
            
                break;
            case "1"://normal
               
                break;
        }
        return true;
    }

    private static class ChargingStateCandidateInfo extends CandidateInfo {
        private final CharSequence mLabel;
        private final String mKey;

        ChargingStateCandidateInfo(CharSequence label, String key, boolean enabled) {
            super(enabled);
            mLabel = label;
            mKey = key;
        }

        @Override
        public CharSequence loadLabel() {
            return mLabel;
        }

        @Override
        public Drawable loadIcon() {
            return null;
        }

        @Override
        public String getKey() {
            return mKey;
        }
    }

}

battery_charging_state_settings.xml 只是显示个标题:

<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:title="@string/charging_state"/>

其中关于getMetricsCategory的设置,只需要在项目对应的settings_enums.proto里添加一个自定义的值就可以了

    BATTERY_CHARGING_STATE = 2023;

3.添加activity套壳Fragment,实现跳转

AndroidManifest.xml里添加自己添加的activity

<activity android:name="com.android.settings.fuelgauge.batterysaver.BatsActivity"
            android:exported="true"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>

activity套壳

package com.android.settings.fuelgauge.batterysaver;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.android.settings.core.SettingsBaseActivity;
import com.android.settings.fuelgauge.batterysaver.BatteryChargingState;
import android.view.View;
import android.widget.Toolbar;

import com.android.settings.R;

/**
 * author : suntianhai
 * e-mail : tianhai.sun@t2mobile.com
 * time   : 2023/08/01
 * desc   : add for set Battery Charging mode
 * version: 1.0
 *
 */
public class BatsActivity extends SettingsBaseActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.content_frame, new BatteryChargingState())
            .commit();
    }
}

Intent intent = new Intent();
intent.setClassName(“com.android.settings”,
“com.android.settings.fuelgauge.batterysaver.BatsActivity”);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);

4.拓展提示

主要是想在RadioButton下面添加一些提示提醒隐私政策什么的

import androidx.preference.PreferenceScreen;
import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.SelectorWithWidgetPreference;

    private Context mContext;
    private FooterPreference mPrivacyPreference;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
        mEntries = getContext().getResources().getStringArray(
                R.array.charging_mode);
        mValues = getContext().getResources().getStringArray(
                R.array.charging_mode_value);
        mPrivacyPreference = new FooterPreference(context);
    }
    
    @Override
    public void updateCandidates() {
        final String defaultKey = getDefaultKey();
        final PreferenceScreen screen = getPreferenceScreen();
        screen.removeAll();

        final List<? extends CandidateInfo> candidateList = getCandidates();
        if (candidateList == null) {
            return;
        }

        for (CandidateInfo info : candidateList) {
            SelectorWithWidgetPreference pref =
                    new SelectorWithWidgetPreference(getPrefContext());
            bindPreference(pref, info.getKey(), info, defaultKey);
            screen.addPreference(pref);
        }

        mPrivacyPreference = new FooterPreference(mContext);
        mPrivacyPreference.setIcon(R.drawable.ic_privacy_shield_24dp);
        mPrivacyPreference.setTitle("标题");
        mPrivacyPreference.setSelectable(false);
        mPrivacyPreference.setLayoutResource(R.layout.preference_footer);
        screen.addPreference(mPrivacyPreference);
    }


总结

其实这些都可以直接添加到activity,在里面做自己想要的功能,我只是想保持setting的队形,不想setting这个功能在跳转的时候膈应。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 13Android操作系统的一个版本,通过“settings”可以访问设备的各种设置选项。在Android 13的设置中,用户可以对设备进行个性化的配置和管理。 首先,用户可以在设置中调整设备的显示设置。包括屏幕亮度、分辨率、字体大小等选项,用户可以根据自己的喜好和需求进行调整。此外,还可以设置壁纸、锁屏样式和桌面图标等,为手机带来更好的视觉体验。 其次,用户可以在设置中管理网络连接。可以设置Wi-Fi网络和移动数据的开关,连接到可用的Wi-Fi网络,管理保存的Wi-Fi网络和移动数据的使用情况,以避免流量浪费。此外,还可以进行蓝牙、NFC等无线通信功能的管理。 除此之外,设置还提供了安全和隐私选项。用户可以设置屏幕锁定方式,如图案、密码、指纹等,保护手机中的个人信息。还可以管理应用程序权限,决定哪些应用可以访问相机、麦克风、联系人等敏感信息。 设置还涵盖了音频、电池、存储、应用管理等方面。用户可以调整音量和声音模式、查看电池使用情况、管理内部存储和外部存储设备等。此外,还可以管理应用程序,包括安装、卸载、更新和权限管理等选项。 总而言之,Android 13的设置提供了全面的设备管理选项,用户可以根据自己的需要进行个性化配置和管理。无论是调整显示设置、管理网络连接还是保护个人信息,用户都可以通过设置轻松地完成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值