import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
public class BleScannerService extends Service {
private KeepAliveCountdownTimer keepAliveCountdownTimer;
private Context mcontext;
//--------------------------------------------------------------
public BleScannerService(){
}
//--------------------------------------------------------------
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
//--------------------------------------------------------------
private void printLog (final String text){
Log.i("BLE", "[BleScannerService]>>\t" + text);
}
//--------------------------------------------------------------
private void init(){
printLog("init...");
mcontext = this;
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
getApplication().registerReceiver(bleBroadcastReceiver, filter);
if (checkBleAdapterStatus()){
BleScanner.getInstance().setContext(this);
BleScanner.getInstance().startScan();
printLog("start ble scanner...");
}else{
printLog("can not start ble scanner...");
}
keepAliveCountdownTimer = new KeepAliveCountdownTimer(10000,1000);
keepAliveCountdownTimer.start();
}
//--------------------------------------------------------------
@Override
public void onCreate() {
printLog("created...");
init();
}
//--------------------------------------------------------------
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
printLog("onStartCommand...");
return START_NOT_STICKY;
}
//--------------------------------------------------------------
@Override
public void onDestroy() {
printLog("destroyed...");
keepAliveCountdownTimer.cancel();
BleScanner.getInstance().stopScan();
}
//--------------------------------------------------------------
public void destroy(){
keepAliveCountdownTimer.cancel();
BleScanner.getInstance().stopScan();
printLog("destroy...");
}
//--------------------------------------------------------------
private class KeepAliveCountdownTimer extends CountDownTimer{
public KeepAliveCountdownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long l) {
}
@Override
public void onFinish() {
printLog("keep alive...");
start();
}
}
//--------------------------------------------------------------
private boolean checkBleAdapterStatus(){
printLog("checkBleAdapterStatus...");
BluetoothManager bluetoothManager = (BluetoothManager) getApplication().getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()){
printLog("bluetooth status false...");
return false;
}
printLog("bluetooth status true...");
return true;
}
//--------------------------------------------------------------
private final BroadcastReceiver bleBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
switch(state) {
case BluetoothAdapter.STATE_OFF:
printLog("BLE: STATE_OFF");
BleScanner.getInstance().stopScan();
break;
case BluetoothAdapter.STATE_TURNING_OFF:
printLog("BLE: STATE_TURNING_OFF");
break;
case BluetoothAdapter.STATE_ON:
printLog("BLE: STATE_ON");
BleScanner.getInstance().setContext(mcontext);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
printLog("start ble scanner...");
BleScanner.getInstance().startScan();
}
}).start();
break;
case BluetoothAdapter.STATE_TURNING_ON:
printLog("BLE: STATE_TURNING_ON");
break;
}
}
}
};
//------------------------------------------------------------------------
}