SystemUI TileService的使用教程-屏幕常亮按钮的添加

TileService

AndroidManifest.xml

        <service
            android:name=".systemui.KeepScreenOnTileService"
            android:icon="@drawable/toggleon"
            android:label="屏幕常亮"
            android:permission="android.permission.BIND_QUICK_SETTINGS_TILE" >
            <intent-filter>
                <action android:name="android.service.quicksettings.action.QS_TILE" />
            </intent-filter>
        </service>

KeepScreenOnTileService.java

public class KeepScreenOnTileService extends TileService {
    private String TAG = "KeepScreenOnTileService";
    private RemoteViews mRemoteViews;
    private SharedPreferences mSharedPreferences;
    private Intent mServiceIntent;
    private static final String ACTION_KEEP_SCREEN_ON_DISABLED =                                                                "com.samsung.systemui.action.KEEP_SCREEN_ON_DISABLED";
    private NotificationManager mNotificationManager;
    private static final int KEEPSCREEN_ON_NOTIFICATION = 0x1234;
​
    @Override
    public void onCreate() {
        super.onCreate();
        mSharedPreferences = getSharedPreferences("user", Context.MODE_PRIVATE);
        mServiceIntent = new Intent();
        mServiceIntent.setClassName("com.zw.myandroid", "com.zw.myandroid.systemui.KeepScreenOnService");
        mNotificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_KEEP_SCREEN_ON_DISABLED);
        registerReceiver(mReceiver, filter, null, null);
    }
​
    // 当用户从Edit栏添加到快速设定中调用
    @Override
    public void onTileAdded() {
    }
​
    // 当用户从快速设定栏中移除的时候调用
    @Override
    public void onTileRemoved() {
    }
​
    // 点击图标的时候
    @Override
    public void onClick() {
        handleStatusChanged();
        boolean isKeepScreenOn = mSharedPreferences.getBoolean("keep_screen_on", false);
        mServiceIntent.putExtra("keep_screen_on", isKeepScreenOn);
        startService(mServiceIntent);
    }
​
    // 打开下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用
    // 在onTileAdded之后会调用一次
    @Override
    public void onStartListening() {
        Tile tile = getQsTile();
        if (tile == null) {
            return;
        }
        boolean isKeepScreenOn = mSharedPreferences.getBoolean("keep_screen_on", false);
        Log.d(TAG, "isKeepScreenOn:" + isKeepScreenOn);
        tile.setState(isKeepScreenOn ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE);
        tile.updateTile();
    }
​
    // 关闭下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用
    // 在onTileRemoved移除之前也会调用移除
    @Override
    public void onStopListening() {
        Log.d(TAG, "onStopListening");
    }
​
    // 详细信息页面-RemoteViews
    @Override
    public RemoteViews semGetDetailView() {
        Log.d(TAG, "semGetDetailView");
        mRemoteViews = new RemoteViews(this.getPackageName(), R.layout.tile_customer);
        boolean isKeepScreenOn = mSharedPreferences.getBoolean("keep_screen_on", false);
        mRemoteViews.setTextViewText(R.id.textView, "开关状态" + isKeepScreenOn);
        mRemoteViews.setTextColor(R.id.textView, Color.BLACK); //需要设置颜色,不然文字看不清
        return mRemoteViews;
    }
​
    // 更改状态,刷新快捷按钮和详细信息
    private void handleStatusChanged() {
        Tile tile = getQsTile();
        if (tile == null) {
            return;
        }
        boolean isKeepScreenOn = mSharedPreferences.getBoolean("keep_screen_on", false);
        updateNotification(!isKeepScreenOn);
        Editor editor = mSharedPreferences.edit();
        editor.putBoolean("keep_screen_on", !isKeepScreenOn);
        editor.commit();
        tile.setState(isKeepScreenOn ? Tile.STATE_INACTIVE : Tile.STATE_ACTIVE);
        tile.updateTile();
        semUpdateDetailView();
    }
​
    @Override
    public CharSequence semGetDetailViewTitle() {
        return "屏幕常亮";
    }
​
    @Override
    public Intent semGetSettingsIntent() {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
        return intent;
    }
​
    //详细信息是否有开关
    @Override
    public boolean semIsToggleButtonExists() {
        return true;
    }
​
    //详细信息开关点击事件
    @Override
    public void semSetToggleButtonChecked(boolean checked) {
        super.semSetToggleButtonChecked(checked);
        handleStatusChanged();
        semUpdateDetailView();
    }
​
    //详细信息开关初始化
    @Override
    public boolean semIsToggleButtonChecked() {
        boolean isKeepScreenOn = mSharedPreferences.getBoolean("keep_screen_on", false);
        return isKeepScreenOn;
    }
​
    @Override
    public CharSequence semGetDetailViewSettingButtonName() {
        return null;
    }
​
    //启用禁用自定义快捷方式,不会自动刷新
    public static void setTilesEnabled(Context context, boolean enable) {
        final PackageManager pm = context.getPackageManager();
        String ACTIVITY_NAME = "com.zw.myandroid.systemui.KeepScreenOnTileService";
        String PKG_NAME = "com.zw.myandroid";
        ComponentName cn = new ComponentName(PKG_NAME, ACTIVITY_NAME);
        pm.setComponentEnabledSetting(cn, enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
    }
​
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (ACTION_KEEP_SCREEN_ON_DISABLED.equals(action)) {
                handleStatusChanged();
            }
        }
    };
​
    //发送或者删除通知
    private void updateNotification(boolean enabled) {
        if (enabled) {
            Intent intent = new Intent();
            intent.setAction(ACTION_KEEP_SCREEN_ON_DISABLED);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent,                                                 PendingIntent.FLAG_UPDATE_CURRENT);
            Notification.Builder builder = new Notification.Builder(this);
            builder.setSmallIcon(R.drawable.toggleon).setVisibility(Notification.VISIBILITY_PUBLIC)
                    .setContentTitle("保持屏幕常亮").setShowWhen(false)
                      .setOngoing(true).addAction(0, "关闭", pendingIntent);
            mNotificationManager.notify(KEEPSCREEN_ON_NOTIFICATION, builder.build());
        } else {
            Log.d(TAG, "cancelNotification!!!");
            mNotificationManager.cancel(KEEPSCREEN_ON_NOTIFICATION);
        }
    }
}

KeepScreenOnService.java

public class KeepScreenOnService extends Service {
    private PowerManager mPowerManager;
    private PowerManager.WakeLock mCpuWakeLock;
    SharedPreferences mSharedPreferences;
​
    @Override
    public void onCreate() {
        super.onCreate();
        mSharedPreferences = getSharedPreferences("user", Context.MODE_PRIVATE);
        mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        mCpuWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK                                                    |PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.ON_AFTER_RELEASE, "wake_up");
    }
​
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
​
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        boolean isKeepScreenOn = mSharedPreferences.getBoolean("keep_screen_on", false);
        if (isKeepScreenOn) {
            mCpuWakeLock.acquire();
        } else {
            if (mCpuWakeLock.isHeld()) {
                mCpuWakeLock.release();
            }
        }
        return START_STICKY;
    }
​
    @Override
    public void onDestroy() {
        if (mCpuWakeLock.isHeld()) {
            mCpuWakeLock.release();
        }
    }
}

Keep screen on

1.在Activity中添加

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

2.界面布局文件中直接设置

android:keepScreenOn="true"  

3.使用WAKE_LOCK

<uses-permission android:name="android.permission.WAKE_LOCK" />
​
PowerManager.WakeLock mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
mCpuWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK                                                    |PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.ON_AFTER_RELEASE, "wake_up");
// mCpuWakeLock.setReferenceCounted(false);  //是否需计算锁的数量
mCpuWakeLock.acquire();
mCpuWakeLock.release();
/*
PARTIAL_WAKE_LOCK:       保持CPU 运转,屏幕和键盘灯可以关闭。
SCREEN_DIM_WAKE_LOCK:   保持CPU 运转,保持屏幕显示,但可以变暗,允许键盘灯关闭。
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许键盘灯关闭。
FULL_WAKE_LOCK:         保持CPU 运转,保持屏幕和键盘灯都高亮显示。
ACQUIRE_CAUSES_WAKEUP:  当获取锁后,立刻亮屏,典型地使用在通知中,以让用户立刻查看。
ON_AFTER_RELEASE:       在释放锁(release())后,手机屏幕仍会继续亮一会儿。
*/
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yinhunzw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值