1.流程,思路

首先监听一个系统开机广播,开机完成后启动一个服务去注册我们要监听的系统广播,接收到之后做具体处理,

在这个流程中,遇到几个头疼的问题,第一就是监听开机广播后服务启动问题,在Android8.0(26) 以后,主要为了性能的提升,比如省电,对APP(targetsdk >= 26)的控制加强了很多。

比如不能监听大部分静态注册(在Manifest里配置)的系统广播,APP层自己的静态广播也不允许了,只能动态注册(在代码里注册),不过官网也推荐可以使用JobScheduler 代替静态广播,也是不错的方法;

还有就是启动服务也有很大的限制,APP(targetsdk >= 26)不在前台的时候再也不能启动后台服务(startService), 只能启动前台服务(两种情况,第一种是APP本身处于前台即可见状态,第二种是直接

startForegroundService),这样也是为了让用户知道有服务在运行,对于APP(targetsdk < 26)的可以正常使用,但是Settings也可以对其进行相同的控制,官网建议都用前台服务代替。

2. 具体步骤

public class BootCompleteReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if(Intent.ACTION_BOOT_COMPLETED.equals(action)) {

Intent service = new Intent(context, RegisterService.class);

context.startService(service);

}

}

}

public class RegisterService extends Service {

@Override

public void onCreate() {

registerB();

}

@Nullable

@Override

public IBinder onBind(Intent intent) {

return null;

}

private void registerB() {

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);

registerReceiver(new BatterySaverGlobalReceiver(), intentFilter);

}

}

public class BatterySaverGlobalReceiver extends BroadcastReceiver {

private static final String TAG = "BatterySaverGlobalReceiver";

private static final boolean DEBUG = true;

private static final String SHARED_PREF_NAME_POWER_SAVE_MODE = "power_save_mode_settings";

private static final String PREF_KEY_SCREEN_OFF_TIMEOUT = "screen_off_timeout";

private Context mContext;

private static final String PREF_KEY_LOCATION_MODE = "location_mode";

private static final String PREF_KEY_BLUETOOTH_ENABLED = "bt_enabled";

private static final String PREF_KEY_WIFI_ENABLED = "wifi_enabled";

private static final String PREF_KEY_WIFI_AP_ENABLED = "wifi_ap_enabled";

private static final String PREF_KEY_NFC_ENABLED = "nfc_enabled";

private static final String PREF_KEY_MOBILE_DATA_ENABLED= "mobile_data_enabled";

private BluetoothAdapter mBlueToothAdapter;

private WifiManager mWifiManager;

private NfcAdapter mNfcAdapter;

private ConnectivityManager mConnManager;

private TelephonyManager mTelephonyManager;

@Override

public void onReceive(Context context, Intent intent) {

mContext = context;

PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);

String action = intent.getAction();

android.util.Log.d(TAG, "onReceive action : " + action);

initValues();

if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {

final boolean mode = pm.isPowerSaveMode();

if(DEBUG) {

android.util.Log.d(TAG, "onPowerSaveModeChanged isPowerSaveMode :" + mode);

}

if(mode) {

saveSettings();

setScreenOffTimeout(30*1000);

setLocationMode(Settings.Secure.LOCATION_MODE_OFF);

setBtEnabled(false);

mWifiManager.setWifiEnabled(false);

setWifiApEnabled(false);

setNfcEnabled(false);

mTelephonyManager.setDataEnabled(false);

} else {

restoreSettings();

}

}

}

private void initValues() {

if (mBlueToothAdapter == null) {

mBlueToothAdapter = BluetoothAdapter.getDefaultAdapter();

}

if (mWifiManager == null) {

mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);

}

if (mNfcAdapter == null) {

mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext);

}

if (mConnManager == null) {

mConnManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);

}

if (mTelephonyManager == null) {

mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);

}

}

private void saveSettings() {

if(DEBUG) {

android.util.Log.d(TAG, "saveSettings");

}

int timeout = 0;

int locationMode = -1;

try {

timeout = Settings.System.getInt(mContext.getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT);

locationMode = Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.LOCATION_MODE);

} catch (Settings.SettingNotFoundException e) {

e.printStackTrace();

}

boolean isBtEnabled = mBlueToothAdapter.isEnabled();

boolean isWifiEnabled = mWifiManager.isWifiEnabled();

boolean isWifiApEnabled = mWifiManager.isWifiApEnabled();

boolean isNfcEnabled = mNfcAdapter.isEnabled();

boolean isMobileDataEnabled = mTelephonyManager.isDataEnabled();

SharedPreferences sharedPref = getPowerSaveModeSharedPref();

SharedPreferences.Editor editor = sharedPref.edit();

editor.putInt(PREF_KEY_SCREEN_OFF_TIMEOUT, timeout);

editor.putInt(PREF_KEY_LOCATION_MODE, locationMode);

editor.putBoolean(PREF_KEY_BLUETOOTH_ENABLED, isBtEnabled);

editor.putBoolean(PREF_KEY_WIFI_ENABLED, isWifiEnabled);

editor.putBoolean(PREF_KEY_WIFI_AP_ENABLED, isWifiApEnabled);

editor.putBoolean(PREF_KEY_NFC_ENABLED, isNfcEnabled);

editor.putBoolean(PREF_KEY_MOBILE_DATA_ENABLED, isMobileDataEnabled);

editor.commit();

if(DEBUG) {

android.util.Log.d(TAG, "timeout :" + timeout +

" ,locationMode : " + locationMode + ", isBtEnabled : " + isBtEnabled +

", isWifiEnabled : " + isWifiEnabled + " ,isNfcEnabled : " + isNfcEnabled +

", isMobileDataEnabled : " + isMobileDataEnabled + ", isWifiApEnabled : " + isWifiApEnabled);

}

}

private void restoreSettings() {

SharedPreferences sharedPref = getPowerSaveModeSharedPref();

int timeout = sharedPref.getInt(PREF_KEY_SCREEN_OFF_TIMEOUT, 1*60*1000);

setScreenOffTimeout(timeout);

if(DEBUG) {

android.util.Log.d(TAG, "restoreSettings timeout :" + timeout);

}

int locationMode = sharedPref.getInt(PREF_KEY_LOCATION_MODE, -1);

setLocationMode(locationMode);

boolean isBtEnabled = sharedPref.getBoolean(PREF_KEY_BLUETOOTH_ENABLED, false);

setBtEnabled(isBtEnabled);

boolean isWifiEnabled = sharedPref.getBoolean(PREF_KEY_WIFI_ENABLED, false);

mWifiManager.setWifiEnabled(isWifiEnabled);

boolean isWifiApEnabled = sharedPref.getBoolean(PREF_KEY_WIFI_AP_ENABLED, false);

setWifiApEnabled(isWifiApEnabled);

boolean isNfcEnabled = sharedPref.getBoolean(PREF_KEY_NFC_ENABLED, false);

setNfcEnabled(isNfcEnabled);

boolean isMobileDataEnabled = sharedPref.getBoolean(PREF_KEY_MOBILE_DATA_ENABLED, false);

mTelephonyManager.setDataEnabled(isMobileDataEnabled);

}

private SharedPreferences getPowerSaveModeSharedPref() {

return mContext.getSharedPreferences(SHARED_PREF_NAME_POWER_SAVE_MODE, Context.MODE_PRIVATE);

}

private void setScreenOffTimeout(int timeout) {

Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, timeout);

}

private void setLocationMode(int mode) {

Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.LOCATION_MODE, mode);

}

private void setBtEnabled(boolean enabled) {

if(enabled) {

mBlueToothAdapter.enable();

} else {

mBlueToothAdapter.disable();

}

}

private void setNfcEnabled(boolean enabled) {

if (enabled) {

mNfcAdapter.enable();

} else {

mNfcAdapter.disable();

}

}

private void setWifiApEnabled(boolean enabled) {

if (enabled) {

mConnManager.startTethering(ConnectivityManager.TETHERING_WIFI,

true, new OnStartTetheringCallback());

} else {

mConnManager.stopTethering(ConnectivityManager.TETHERING_WIFI);

}

}

private static final class OnStartTetheringCallback

extends ConnectivityManager.OnStartTetheringCallback {

@Override

public void onTetheringStarted() {

if(DEBUG) {

android.util.Log.d(TAG, "onTetheringStarted");

}

}

@Override

public void onTetheringFailed() {

if(DEBUG) {

android.util.Log.d(TAG, "onTetheringFailed");

}

}

}

}

安卓代码怎么设置省电模式_android 8.1 监控省电模式,触发各种开关相关推荐

  1. 安卓代码怎么设置省电模式_Android 5.0如何开启省电模式?Android 5.0如何省电?...

    Android 5.0如何开启省电模式?Android 5.0如何省电? 你也许还没有注意到,Android 5.0 Lollipop版本统正式加入了电池保护模式.这一功能的引进,帮助Android用 ...

  2. 安卓代码怎么设置省电模式_安卓手机怎么设置省电模式

    无论何种牌子的安卓手机,开启智能省电模式后能大大节约电池的耗电量,不管手机电量高低,开启此项功能,都可以大大延长手机电量的使用.那么安卓手机的省电模式在哪?又怎么样设置呢?下面小编就为大家介绍安卓手机 ...

  3. 安卓代码怎么设置省电模式_Android 5.0开启省电模式的方法 Android 5.0省电介绍

    你也许还没有注意到,Android 5.0 Lollipop版本统正式加入了电池保护模式.这一功能的引进,帮助Android用户彻底告别了需要寻找第三方应用程序来延长续航时间的尴尬日子.当然,在该项功 ...

  4. 安卓代码怎么设置省电模式_红米手机怎么设置省电模式?

    红米Note手机虽然配备了大容量电池,但是鉴于其屏幕也特别大,所以耗电量也是不可小觑的,基本上是一天充一次电,有时不够一天使用,在此向大家介绍红米省电模式的相关设置. 方法/步骤 1.开机,打开主页, ...

  5. 安卓访客模式_Android 5.0利用访客模式设置双桌面教程

    小编一直都在疑惑,为何Android系统不能够像电脑一样设置一个不同的桌面,以免别人在玩自己手机的时候把自己的系统弄得乱七八糟.这么方便的功能为何没有被考虑在内,难道是工程师们都忘记了?事实其实并不是 ...

  6. android 在代码中设置样式,安卓代码中设置fontFamily中的样式

    今天和视觉调样式的时候,发现一个问题,我们代码中经常使用fontFamily的样式,比如: android:id="@+id/name" android:layout_width= ...

  7. activity 启动模式_Android世界:Activity的启动模式及其适用范围

    一.Activity启动模式简介 activity启动模式,可以理解为activity在任务栈(也叫"回退栈")的回退规则,即点击"back"键时,activi ...

  8. 【嵌入式开发】ARM 处理器工作模式 及 修改方法 ( 处理器模式 | 设置处理器模式 | 程序状态字寄存器 CPSR SPSR | 模式设置代码编写 | 设置 svc 模式 )

    一. 处理器工作模式相关介绍 1. 处理器模式简介 (1) 处理器工作模式分类 (2) 处理器不同工作模式区别 (3) Linux 系统运行的模式 (4) 特权模式 说明 (5) 异常模式 (6) 系 ...

  9. Windows 11 设置开启S3深度睡眠 仅保留内存工作 最省电的睡眠模式 禁用现代待机 解决睡眠后主机还在运行风扇还在转

    轻薄笔记本本也许S0级别的睡眠是可以使用的,因为本身其就不费电,但是游戏本往往都是高能耗,又或者直接上的台式机降功率的CPU,S0级别的睡眠可能一晚上就直接没电了,属实玩不起. 为什么S0睡眠这么耗电 ...

最新文章

  1. 【杂谈】篇篇精华,有三AI不得不看的技术综述(超过100篇核心干货)
  2. git全局ignore
  3. 去重数组里面重复数据
  4. Mac 安装 homebrew 流程 以及 停在 Updating Homebrew等 常见错误解决方法
  5. http://blog.csdn.net/jiazimo/article/details/17265061
  6. ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)
  7. STAMP学习和使用
  8. 【修身养性】那些看不见的教养
  9. graphpad做柱状图_轻松搞定各种柱状图
  10. limbo模拟器安装linux,limbo模拟器win10镜像安装使用教程(附下载)
  11. CVPR 2020 论文大盘点-人脸技术篇
  12. uniApp APP端 支付/分享 微信开放平台的Android 包名签名的坑
  13. android热门搜索标签,Android网易云历史搜索和热门标签
  14. C++中左移运算符<<、右移运算符>>、以及位与运算符
  15. Vivado与Matlab版本匹配表
  16. 隐藏IDEA的行首的黄色小灯泡
  17. C语言高墙高,院子里有两棵树。因为有高墙庇护,一棵树长得高大挺直。而另一棵...
  18. 干货 | 携程微信小程序如何进行Size治理
  19. zynq操作系统: jffs2文件系统的错误异常
  20. 网络-----各种协议等

热门文章

  1. 人人站CMS-站长工具箱上线(常用工具汇总)
  2. 基于序列的深度学习抗体设计及其在电子抗体亲和力成熟中的应用
  3. MySQL基础语法之三:join语法
  4. 借助AI实现“学渣”到“学霸”逆袭,深度学习在学霸君的实践
  5. 6 issues were found when checking AAR metadata:
  6. TPU材料开启汽车行业柔性新应用
  7. php phpexcel 读,PHP phpexcel读取xls文件内容
  8. 设置个性桌面计算机教案,第3课 设置个性“桌面”
  9. HCIA-RS自用笔记(13)路由典型问题案例分析、动态路由概述
  10. 【k8s】理解Docker容器的进程管理(PID1进程(容器内kill命令无法杀死)、进程信号处理、僵尸进程)