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.
xiangmuyi/GTaskSyncService.java

172 lines
9.5 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;
// GTaskSyncService类继承自Service用于管理GTask相关的同步任务提供了启动、取消同步任务的功能并且能在不同状态下如内存不足等进行相应处理同时可以对外广播同步相关的状态信息
public class GTaskSyncService extends Service {
// 定义一个字符串常量用于作为区分不同同步操作行为的Intent的Extra字段的键名
public final static String ACTION_STRING_NAME = "sync_action_type";
// 定义一个整数常量表示启动同步任务的操作类型作为通过Intent传递操作类型时的一个标识值
public final static int ACTION_START_SYNC = 0;
// 定义一个整数常量,表示取消同步任务的操作类型
public final static int ACTION_CANCEL_SYNC = 1;
// 定义一个整数常量,表示无效的操作类型,可能用于默认情况或者错误处理时的标识
public final static int ACTION_INVALID = 2;
// 定义一个字符串常量作为用于广播GTask同步服务相关信息的Intent的动作Action名称用于区分不同来源的广播
public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service";
// 定义一个字符串常量作为广播Intent中用于表示是否正在同步的Extra字段的键名用于传递同步状态信息
public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing";
// 定义一个字符串常量作为广播Intent中用于表示同步进度消息的Extra字段的键名用于传递同步过程中的进度提示等信息
public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg";
// 静态变量用于保存当前正在执行的GTaskASyncTask实例初始化为null表示没有正在进行的同步任务
private static GTaskASyncTask mSyncTask = null;
// 静态变量,用于保存同步任务的进度消息,初始化为空字符串
private static String mSyncProgress = "";
// 私有方法用于启动同步任务如果当前没有正在执行的同步任务则创建一个新的GTaskASyncTask实例并执行它
private void startSync() {
// 判断当前是否没有正在执行的同步任务即mSyncTask为null
if (mSyncTask == null) {
// 创建一个新的GTaskASyncTask实例传入当前服务的上下文this表示当前Service实例以及一个实现了OnCompleteListener接口的匿名内部类对象
mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() {
// 实现OnCompleteListener接口的onComplete方法当同步任务完成时会被调用
public void onComplete() {
// 将正在执行的同步任务实例置为null表示同步任务已结束
mSyncTask = null;
// 发送一个空消息的广播(可能用于通知其他组件同步已完成等情况,具体作用依赖接收广播的组件逻辑)
sendBroadcast("");
// 停止当前服务自身,因为同步任务已经完成,服务不再需要继续运行
stopSelf();
}
});
// 发送一个空消息的广播(可能在任务启动阶段通知其他组件同步即将开始等情况)
sendBroadcast("");
// 执行同步任务启动后台线程开始执行GTask相关的同步操作
mSyncTask.execute();
}
}
// 私有方法用于取消正在执行的同步任务如果当前有正在执行的同步任务则调用其cancelSync方法进行取消操作
private void cancelSync() {
if (mSyncTask!= null) {
mSyncTask.cancelSync();
}
}
// 重写Service的onCreate方法在服务创建时被调用这里将正在执行的同步任务实例置为null进行初始化操作
@Override
public void onCreate() {
mSyncTask = null;
}
// 重写Service的onStartCommand方法当服务接收到通过startService方法启动的Intent时被调用根据传入Intent中的操作类型执行相应的同步操作逻辑
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 获取传入Intent中的额外数据以Bundle形式存储
Bundle bundle = intent.getExtras();
// 判断Bundle是否不为null且包含了用于区分操作类型的键ACTION_STRING_NAME
if (bundle!= null && bundle.containsKey(ACTION_STRING_NAME)) {
// 根据操作类型的值进行不同的处理通过获取操作类型整数值默认值为ACTION_INVALID如果键不存在
switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) {
// 如果操作类型是启动同步任务
case ACTION_START_SYNC:
// 调用startSync方法启动同步任务
startSync();
break;
// 如果操作类型是取消同步任务
case ACTION_CANCEL_SYNC:
// 调用cancelSync方法取消同步任务
cancelSync();
break;
default:
break;
}
// 返回START_STICKY表示服务在被系统强制关闭后如内存不足等情况会尝试重新创建并启动保持服务的持续可用性但不会重新传递之前的Intent
return START_STICKY;
}
// 如果不符合上述条件调用父类的onStartCommand方法进行默认处理
return super.onStartCommand(intent, flags, startId);
}
// 重写Service的onLowMemory方法当系统内存不足时被调用在这里如果有正在执行的同步任务则取消该任务释放内存资源
@Override
public void onLowMemory() {
if (mSyncTask!= null) {
mSyncTask.cancelSync();
}
}
// 重写Service的onBind方法用于处理绑定服务的情况这里返回null表示该服务不支持绑定操作
public IBinder onBind(Intent intent) {
return null;
}
// 公共方法用于发送包含同步相关状态信息是否正在同步以及进度消息的广播更新同步进度消息并构建广播Intent发送出去
public void sendBroadcast(String msg) {
// 更新同步进度消息
mSyncProgress = msg;
// 创建一个新的Intent设置其动作Action为之前定义的GTask同步服务广播的动作名称用于标识该广播的来源和用途
Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME);
// 向广播Intent中添加Extra数据设置是否正在同步的状态通过判断mSyncTask是否为null来确定不为null表示正在同步
intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask!= null);
// 向广播Intent中添加Extra数据设置同步进度消息使用传入的msg参数作为消息内容
intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg);
// 发送广播将包含同步相关信息的Intent广播出去以便其他组件可以接收并处理这些信息
sendBroadcast(intent);
}
// 静态公共方法用于从Activity中启动同步任务设置相关的Activity上下文到GTaskManager并发送启动同步任务的Intent到GTaskSyncService
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);
}
// 静态公共方法用于从给定的上下文通常是Activity或其他组件所在的上下文中取消同步任务发送取消同步任务的Intent到GTaskSyncService
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);
}
// 静态公共方法用于判断当前是否有正在执行的同步任务通过检查mSyncTask是否为null来确定返回布尔值表示同步状态
public static boolean isSyncing() {
return mSyncTask!= null;
}
// 静态公共方法,用于获取当前的同步进度消息,返回保存同步进度消息的字符串变量的值
public static String getProgressString() {
return mSyncProgress;
}
}