应用获取时间戳异常后通过系统应用修改时间

本文介绍了一种解决Android应用因系统时间异常而导致连接服务器失败的方法。通过在应用层发送广播给系统应用来修改系统时间,并通过后台服务定时获取网络时间进行同步。

一 综述

Android平台上面一个应用需要获取平台的系统时间作为时间戳,但是有时候系统启动的时候会将时间恢复到1970年~~这个初始时间,因此会导致应用和服务器之间的连接异常,因此有必要通过修改系统时间来解决这种启动异常导致的问题,但是修改Android系统时间是需要系统权限的,一般的应用层APP无法满足这个要求,不过,幸好能够在源码平台进行编译,因此主要的思路就是应用层APP启动异常之后通过广播通知在后台运行的一个系统应用(其实就是一个service)进行系统时间的修改,完成之后再通过广播告知应用层APP,系统时间修复成功,最后再应用层的APP重新获取时间戳登录服务器。整个思路比较明朗的,但是由于涉及到系统应用的编译等问题,结果前后折腾了一天才完成。

二 应用层广播

当系统启动异常之后,登录服务器失败,随即发出广播:
测试工程中的代码

public class MainActivity extends AppCompatActivity {
   
   

    public static final String ACTION_GET_NET_TIME_TO_SET_SYSTEM_TIM = "ACTION_GET_NET_TIME_TO_SET_SYSTEM_TIM";
    private Button send;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        send = (Button)findViewById(R.id.send);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendBroadcastToSystemTimeSetAPP("TEST");
            }
        });
    }

    /**
     * function: send broadcast to systemtimeset APP to test.
     *
     * */
    public void sendBroadcastToSystemTimeSetAPP(String message){
        //发送广播
        String broadcastIntent = ACTION_GET_NET_TIME_TO_SET_SYSTEM_TIM;
        Intent intent = new Intent(broadcastIntent);
        intent.putExtra("MESSAGE", message);
        MainActivity.this.sendBroadcast(intent);
    }
}

二 系统应用的编写

由于普通APP并没有修改系统时间的权限,因此专门写了一个应用在源码环境进行编译,主要工作就是在后台运行的service等待应用层广播去进行网络事件的获取和系统时间的修改。
通过一个activity来启动service,使用的是ServiceConnection,应为这样可以直接调用service里面的方法:


public class MainActivity extends Activity {
   
   

    public static Handler mReceiveTimeSetHandler;
    private GetNetTimeToSetSystemTimeService.TimeToSetBinder mTimeToSetBinder;
    private Context mContext;
    private ServiceConnection mServiceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {

            mTimeToSetBinder = (GetNetTimeToSetSystemTimeService.TimeToSetBinder)iBinder;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        //bind service
        Intent bindServiceIntent = new Intent(this, GetNetTimeToSetSystemTimeService.class);
        boolean isBind = bindService(bindServiceIntent, mServiceConnection, this.BIND_AUTO_CREATE);
        mReceiveTimeSetHandler
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值