package net.dev123.yibo;
import java.util.ArrayList;
import java.util.List;
import net.dev123.yibo.common.Constants;
import net.dev123.yibo.db.LocalAccount;
import net.dev123.yibo.service.listener.ShakeUpdateListener;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.IBinder;
import android.util.Log;
public class AutoUpdateService extends Service {
private static final String TAG = AutoUpdateService.class.getSimpleName();
private static List<LocalAccount> accountList = new ArrayList<LocalAccount>();
private YiBoApplication yibo;
private AutoUpdateNotifyReceiver updateNotifyReceiver;
private AutoUpdateReceiver updateReceiver;
private ConnectionChangeReceiver connChangeReceiver;
private AlarmManager alarmManager;
private ShakeUpdateListener shakeUpdateListener;
private ScreenOffReceiver screenOffReceiver;
private ScreenOnReceiver screenOnReceiver;
@Override
public void onCreate() {
super.onCreate();
//启动网络监听;
connChangeReceiver = new ConnectionChangeReceiver();
IntentFilter connFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
this.registerReceiver(connChangeReceiver, connFilter);
updateNotifyReceiver = new AutoUpdateNotifyReceiver();
IntentFilter updateNotifyFilter = new IntentFilter(Constants.ACTION_RECEIVER_AUTO_UPDATE_NOTIFY);
this.registerReceiver(updateNotifyReceiver, updateNotifyFilter);
updateReceiver = new AutoUpdateReceiver(accountList);
IntentFilter updateFilter = new IntentFilter(Constants.ACTION_RECEIVER_AUTO_UPDATE);
this.registerReceiver(updateReceiver, updateFilter);
yibo = (YiBoApplication)this.getApplication();
shakeUpdateListener = new ShakeUpdateListener(this);
shakeUpdateListener.startMonitor();
//锁屏和解屏的接收器
screenOffReceiver = new ScreenOffReceiver();
IntentFilter screenOffFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
this.registerReceiver(screenOffReceiver, screenOffFilter);
screenOnReceiver = new ScreenOnReceiver();
IntentFilter screenOnFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
this.registerReceiver(screenOnReceiver, screenOnFilter);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Intent updateIntent = new Intent(Constants.ACTION_RECEIVER_AUTO_UPDATE);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, updateIntent, 0);
if (alarmManager != null) {
alarmManager.cancel(pi);
} else {
alarmManager = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
}
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 120000,
yibo.getUpdateInterval() * 1000, pi
);//重复设置
if(Constants.DEBUG) {
Log.v(TAG, "start autoUpdateService, interval: " + yibo.getUpdateInterval() + "s!");
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
this.unregisterReceiver(updateNotifyReceiver);
this.unregisterReceiver(updateReceiver);
this.unregisterReceiver(connChangeReceiver);
this.unregisterReceiver(screenOffReceiver);
this.unregisterReceiver(screenOnReceiver);
if (alarmManager != null) {
Intent updateIntent = new Intent(Constants.ACTION_RECEIVER_AUTO_UPDATE);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, updateIntent, 0);
alarmManager.cancel(pi);
}
if (shakeUpdateListener != null) {
shakeUpdateListener.stopMonitor();
}
if (Constants.DEBUG) {
Log.v(TAG, "AutoUpdateService destory");
}
}
public static void registerUpdateAccount(LocalAccount account) {
if (account == null || accountList.contains(account)) {
return;
}
accountList.add(account);
if (Constants.DEBUG) {
Log.v(TAG, "register update account, accountId:" + account.getAccountId());
}
}
public static void removeUpdateAccount(LocalAccount account) {
if (account == null || !accountList.contains(account)) {
return;
}
accountList.remove(account);
}
public class ScreenOffReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Constants.DEBUG) Log.d(TAG, "Screen Off");
if (shakeUpdateListener != null) {
shakeUpdateListener.stopMonitor();
}
}
}
public class ScreenOnReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Constants.DEBUG) Log.d(TAG, "Screen On");
if (shakeUpdateListener != null) {
shakeUpdateListener.startMonitor();
}
}
}
}