客户可通过广播来修改系统时间,日期和时间格式。

做一个广播接收者,这里就不放在系统层的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);

    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Youth King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值