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())后,手機屏幕仍會繼續亮一會兒。
*/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM