/* * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) * * 版权声明:本文件由MiCode开源社区开发,遵循Apache License, Version 2.0协议; * 您仅在遵守协议的前提下使用本文件,完整协议可通过以下链接获取: * http://www.apache.org/licenses/LICENSE-2.0 * 注:未书面明确要求时,本软件按"原样"提供,不附带任何明示或暗示的保证。 */ package net.micode.notes.gtask.remote; import android.app.Activity; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.IBinder; /** * Google任务同步服务类(后台服务组件) * 负责管理同步任务的启动、取消,并通过广播通知外部同步状态(如是否同步中、进度信息) */ public class GTaskSyncService extends Service { // 服务意图中传递的动作类型键名 public final static String ACTION_STRING_NAME = "sync_action_type"; // 动作类型:启动同步 public final static int ACTION_START_SYNC = 0; // 动作类型:取消同步 public final static int ACTION_CANCEL_SYNC = 1; // 动作类型:无效操作 public final static int ACTION_INVALID = 2; // 同步状态广播的Action名称(用于发送同步状态通知) public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; // 广播中传递的"是否正在同步"键名 public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; // 广播中传递的"进度消息"键名 public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg"; // 当前运行的异步同步任务实例(静态变量,全局唯一) private static GTaskASyncTask mSyncTask = null; // 当前同步进度的文本描述(静态变量,记录最新进度) private static String mSyncProgress = ""; /** * 启动同步任务(内部方法) * 检查是否已有同步任务运行,若无则创建新任务并执行 */ private void startSync() { if (mSyncTask == null) { // 避免重复启动同步任务 // 创建异步任务实例,传入服务上下文和完成监听器 mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { @Override public void onComplete() { // 同步完成后:清空任务实例 -> 发送广播 -> 停止服务自身 mSyncTask = null; sendBroadcast(""); // 发送同步结束的广播(进度消息为空) stopSelf(); // 停止当前服务 } }); sendBroadcast(""); // 发送同步开始的广播(进度消息为空) mSyncTask.execute(); // 执行异步同步任务(触发后台同步逻辑) } } /** * 取消当前同步任务(内部方法) * 若存在运行中的同步任务,则调用其取消方法 */ private void cancelSync() { if (mSyncTask != null) { mSyncTask.cancelSync(); // 触发异步任务的取消逻辑 } } /** * 服务创建时的回调方法 * 初始化成员变量(确保服务启动时无残留任务) */ @Override public void onCreate() { mSyncTask = null; // 清空同步任务实例 } /** * 处理服务启动命令的回调方法 * 根据意图中传递的动作类型(启动/取消同步)执行对应操作 * @param intent 启动服务的意图(可能携带动作类型参数) * @param flags 启动标志(如START_FLAG_REDELIVERY) * @param startId 服务启动的唯一ID * @return 服务重启策略(此处返回START_STICKY,意外终止后自动重启) */ @Override public int onStartCommand(Intent intent, int flags, int startId) { Bundle bundle = intent.getExtras(); // 获取意图携带的参数包 if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { // 根据动作类型执行操作 switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { case ACTION_START_SYNC: // 启动同步 startSync(); break; case ACTION_CANCEL_SYNC: // 取消同步 cancelSync(); break; default: // 无效动作,不处理 break; } return START_STICKY; // 服务意外终止后自动重启 } return super.onStartCommand(intent, flags, startId); } /** * 系统内存不足时的回调方法 * 释放资源,取消当前同步任务以避免内存溢出 */ @Override public void onLowMemory() { if (mSyncTask != null) { mSyncTask.cancelSync(); // 内存不足时强制取消同步任务 } } /** * 绑定服务时的回调方法(本服务不支持绑定) * @param intent 绑定意图 * @return 始终返回null(表示不支持绑定) */ public IBinder onBind(Intent intent) { return null; } /** * 发送同步状态广播(通知外部当前同步状态) * @param msg 当前同步进度的文本描述(如"正在初始化任务列表...") */ public void sendBroadcast(String msg) { mSyncProgress = msg; // 更新全局进度信息 Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); // 创建广播意图 intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); // 是否同步中(任务存在则为true) intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); // 传递进度消息 sendBroadcast(intent); // 发送广播 } /** * 静态方法:外部调用启动同步服务 * @param activity 启动服务的Activity上下文(用于设置GTaskManager的Activity引用) */ public static void startSync(Activity activity) { GTaskManager.getInstance().setActivityContext(activity); // 设置GTaskManager的Activity(用于获取认证令牌) Intent intent = new Intent(activity, GTaskSyncService.class); // 创建启动服务的意图 intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); // 传递启动同步动作 activity.startService(intent); // 启动服务 } /** * 静态方法:外部调用取消同步服务 * @param context 上下文(用于启动服务) */ public static void cancelSync(Context context) { Intent intent = new Intent(context, GTaskSyncService.class); // 创建启动服务的意图 intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); // 传递取消同步动作 context.startService(intent); // 启动服务(触发取消逻辑) } /** * 静态方法:检查当前是否正在同步 * @return true表示同步中,false表示未同步 */ public static boolean isSyncing() { return mSyncTask != null; // 通过任务实例是否存在判断 } /** * 静态方法:获取当前同步进度的文本描述 * @return 进度消息字符串(如"正在同步笔记...") */ public static String getProgressString() { return mSyncProgress; // 返回全局进度变量 } }