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