一 综述
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

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

被折叠的 条评论
为什么被折叠?



