You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MiNote/gtask/GTaskSyncService.java

181 lines
7.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 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; // 返回全局进度变量
}
}