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())后,手机屏幕仍会继续亮一会儿。 */