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