做一个广播接收者,这里就不放在系统层的batteryservice里,因为修改系统时间后需要刷新,此时放在系统底层服务接受处理就会自动重启,所以就放在settings里面专门找一个接受广播类,静态接受的,不过这样的坏处就是无法正常发送隐式广播调用,而是得强制转化为显式才能用!,用户发广播的同时也传递了相应的参数做对应修改
Intent要加个setclass或者setpackage等等指定应用发送
如果在BatteryService里面写这个广播接受就可以不用显示发送了,但放在setting里更安全些,第一多了个报名更保险,第二万一有什么错误anr,至少系统不会死,只是设置死了,毕竟是系统时间。可能牵扯很多
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java
导包
import android.provider.Settings;
import android.app.AlarmManager;
接受广播执行逻辑:
if ("com.tyd.set.system_time".equals(intent.getAction())) {
String tzId = intent.getStringExtra("timeZone");
String timeFormat = intent.getStringExtra("timeFormat");
long when = intent.getLongExtra("when",0);
android.util.Log.i("yantao","com.tyd.system_time tzId = "+tzId);
android.util.Log.i("yantao","com.tyd.system_time timeFormat = "+timeFormat);
android.util.Log.i("yantao","com.tyd.system_time when ="+when);
Settings.Global.putInt(context.getContentResolver(), Settings.Global.AUTO_TIME_ZONE,0);
context.getSystemService(AlarmManager.class).setTimeZone(tzId);
android.provider.Settings.System.putString(context.getContentResolver(),
android.provider.Settings.System.TIME_12_24, timeFormat);
context.getSystemService(AlarmManager.class).setTime(when);
}
AndroidManifest.xml ,增加action,因为这是静态注册的广播
<receiver android:name=".fuelgauge.batterytip.AnomalyConfigReceiver"
<action android:name="com.tyd.set.system_time"/>
intent.getLongExtra("when",0);第二参数是默认值,StringExtra的默认都是null,数值类的int short long都要自配一个默认值
context.getSystemService(AlarmManager.class).setTimeZone(tzId);
原本应该是Context.ALARM_SERVICE,但是可能是S的源码里就这个调用的就是AlarmManager这个类,前者找不到对应方法就会报错。
Android 8.0及以上禁止了后台执行,因此无法收到静态注册的隐式广播。
方法一:发送广播时改为显式广播:intent.setPackage(getPackageName())
方法二:添加可后台执行的flag: intent.addFlags(0x01000000)
针对静态注册的广播接受者,接不到那些广播,所以要加上突破限制,比如在phonewindowmanager里面按键发送广播,如果客户apk也是静态注册的话,那就要加突破,不然接不到,当然大部分还是动态注册的那就没关系
private void sendBC(String action) {
android.util.Log.d("tydtech", "action = "+action);
Intent intent = new Intent();
intent.setAction(action);
intent.addFlags(0x01000000);
mContext.sendBroadcast(intent);
}