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.
git.text/src/java/net/micode/notes/gtask/remote/GTaskSyncService.java

291 lines
8.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)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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;
/**
* <p>Google任务同步服务类。</p>
* <p>设计意图作为Android服务组件管理Google任务的同步操作提供同步的启动和取消功能。</p>
* <p>核心职责:</p>
* <ul>
* <li>接收同步操作的启动和取消指令</li>
* <li>管理异步同步任务的生命周期</li>
* <li>通过广播通知同步状态和进度</li>
* <li>处理低内存情况</li>
* </ul>
* <p>与其他类的关键关联:</p>
* <ul>
* <li>使用{@link GTaskASyncTask}执行实际的同步操作</li>
* <li>依赖{@link GTaskManager}进行同步逻辑处理</li>
* <li>通过广播与UI组件通信</li>
* </ul>
*/
public class GTaskSyncService extends Service {
/**
* 操作类型的Intent extra键名
*/
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;
/**
* 同步服务广播的名称
*/
public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service";
/**
* 广播中表示是否正在同步的extra键名
*/
public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing";
/**
* 广播中表示同步进度消息的extra键名
*/
public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg";
/**
* 当前正在执行的同步任务实例
*/
private static GTaskASyncTask mSyncTask = null;
/**
* 当前同步进度消息
*/
private static String mSyncProgress = "";
/**
* 启动Google任务同步操作。
*
* <p>业务逻辑:</p>
* <ul>
* <li>检查是否已有同步任务在执行</li>
* <li>如果没有,则创建新的异步同步任务</li>
* <li>设置任务完成监听器</li>
* <li>发送同步开始的广播</li>
* <li>执行异步同步任务</li>
* </ul>
*/
private void startSync() {
if (mSyncTask == null) {
mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() {
public void onComplete() {
mSyncTask = null;
sendBroadcast("");
stopSelf();
}
});
sendBroadcast("");
mSyncTask.execute();
}
}
/**
* 取消正在执行的Google任务同步操作。
*
* <p>业务逻辑:</p>
* <ul>
* <li>检查是否有同步任务在执行</li>
* <li>如果有,则调用任务的取消方法</li>
* </ul>
*/
private void cancelSync() {
if (mSyncTask != null) {
mSyncTask.cancelSync();
}
}
/**
* 创建服务时的回调方法。
*
* <p>业务逻辑:</p>
* <ul>
* <li>初始化同步任务引用为null</li>
* </ul>
*/
@Override
public void onCreate() {
mSyncTask = null;
}
/**
* 服务启动时的回调方法处理启动服务的Intent。
*
* <p>业务逻辑:</p>
* <ul>
* <li>解析Intent中的操作类型</li>
* <li>根据操作类型执行相应的同步操作(启动或取消)</li>
* <li>返回START_STICKY表示服务被系统终止后会尝试重新启动</li>
* </ul>
*
* @param intent 启动服务的Intent
* @param flags 启动标志
* @param startId 启动ID
* @return 服务的启动模式
*/
@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);
}
/**
* 系统内存不足时的回调方法。
*
* <p>业务逻辑:</p>
* <ul>
* <li>在内存不足的情况下,取消正在执行的同步任务以释放资源</li>
* </ul>
*/
@Override
public void onLowMemory() {
if (mSyncTask != null) {
mSyncTask.cancelSync();
}
}
/**
* 绑定服务时的回调方法。
*
* <p>业务逻辑:</p>
* <ul>
* <li>返回null表示不支持绑定操作</li>
* </ul>
*
* @param intent 绑定服务的Intent
* @return 绑定接口此处返回null
*/
public IBinder onBind(Intent intent) {
return null;
}
/**
* 发送同步状态的广播。
*
* <p>业务逻辑:</p>
* <ul>
* <li>更新同步进度消息</li>
* <li>创建广播Intent并设置同步状态和进度信息</li>
* <li>发送广播通知UI组件同步状态的变化</li>
* </ul>
*
* @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);
intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg);
sendBroadcast(intent);
}
/**
* 静态方法启动Google任务同步服务。
*
* <p>业务逻辑:</p>
* <ul>
* <li>设置GTaskManager的Activity上下文</li>
* <li>创建启动服务的Intent并设置操作类型</li>
* <li>启动同步服务</li>
* </ul>
*
* @param activity 调用该方法的Activity实例
*/
public static void startSync(Activity activity) {
GTaskManager.getInstance().setActivityContext(activity);
Intent intent = new Intent(activity, GTaskSyncService.class);
intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC);
activity.startService(intent);
}
/**
* 静态方法取消Google任务同步服务。
*
* <p>业务逻辑:</p>
* <ul>
* <li>创建启动服务的Intent并设置取消操作类型</li>
* <li>启动同步服务以执行取消操作</li>
* </ul>
*
* @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);
}
/**
* 静态方法:检查是否正在进行同步操作。
*
* <p>业务逻辑:</p>
* <ul>
* <li>通过检查同步任务引用是否为null来判断同步状态</li>
* </ul>
*
* @return true表示正在同步false表示没有同步操作进行
*/
public static boolean isSyncing() {
return mSyncTask != null;
}
/**
* 静态方法:获取当前同步进度消息。
*
* <p>业务逻辑:</p>
* <ul>
* <li>返回当前的同步进度消息</li>
* </ul>
*
* @return 当前同步进度消息
*/
public static String getProgressString() {
return mSyncProgress;
}
}