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.
rass/gtask/remote/GTaskSyncService.java

179 lines
14 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类继承自Android的Service类意味着它是一个可以在后台运行、执行长时间操作的组件通常用于处理一些不依赖于用户界面交互的任务这里大概率是用于处理与GTask相关的同步任务。
public class GTaskSyncService extends Service {
// 定义一个字符串常量用于作为Intent传递的动作类型的标识通过这个标识来区分不同的同步相关操作如开始同步、取消同步等外部组件可以通过设置这个Extra来告诉该服务要执行的具体动作。
public final static String ACTION_STRING_NAME = "sync_action_type";
// 定义一个整型常量表示开始同步的动作类型值当在Intent的Extra中传递这个值时服务会识别为要开始执行同步操作。
public final static int ACTION_START_SYNC = 0;
// 定义一个整型常量,表示取消同步的动作类型值,用于通知服务取消正在进行的同步任务。
public final static int ACTION_CANCEL_SYNC = 1;
// 定义一个整型常量,表示无效的动作类型值,可能在接收到无法识别的动作类型时作为默认处理情况使用。
public final static int ACTION_INVALID = 2;
// 定义一个字符串常量用于作为广播的Action名称通过发送这个Action的广播服务可以向外部组件传达自身的同步状态、进度等相关信息外部组件可以注册接收这个广播来获取相应的更新内容。
public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service";
// 定义一个字符串常量用于作为广播中传递是否正在同步的状态信息的Extra的键在广播的Intent中通过这个键传递一个布尔值来告知外部组件当前服务是否正在进行同步操作。
public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing";
// 定义一个字符串常量用于作为广播中传递同步进度相关消息的Extra的键通过这个键可以在广播的Intent中传递一个字符串向外部组件展示同步任务的进度描述等相关文本信息。
public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg";
// 定义一个静态的GTaskASyncTask类型变量用于存储当前正在执行的同步任务对象通过判断它是否为null来确定是否有同步任务正在进行初始化为null表示初始状态下没有正在执行的同步任务。
private static GTaskASyncTask mSyncTask = null;
// 定义一个静态的字符串变量,用于存储同步进度相关的消息内容,初始化为空字符串,随着同步任务的进行,可以更新这个字符串来对外展示进度信息,外部组件可以通过获取这个字符串来了解同步的大致情况。
private static String mSyncProgress = "";
// 私有方法,用于启动同步任务
private void startSync() {
// 首先判断当前是否已经存在正在执行的同步任务通过检查mSyncTask是否为null如果不存在则创建一个新的GTaskASyncTask实例来执行同步操作。
if (mSyncTask == null) {
// 创建GTaskASyncTask实例传入当前服务的上下文this代表当前GTaskSyncService对象本身它继承自Service所以可以作为上下文传递给需要的地方以及一个OnCompleteListener回调接口的实现。
mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() {
// 实现OnCompleteListener接口的onComplete方法当同步任务完成时会调用这个方法。
public void onComplete() {
// 将mSyncTask置为null表示同步任务已经结束方便后续判断是否有任务正在执行。
mSyncTask = null;
// 发送一个广播,广播消息内容为空字符串,用于通知外部组件同步任务已完成等相关状态变化,外部组件可以注册接收相应广播来做出响应。
sendBroadcast("");
// 停止当前服务自身,因为同步任务已经完成,服务的主要工作结束,可以自行停止以释放资源等。
stopSelf();
}
});
// 发送一个广播,广播消息内容为空字符串,可能用于在启动同步任务时先通知外部组件同步即将开始等相关状态变化,让外部组件可以进行一些准备工作或者界面更新等操作。
sendBroadcast("");
// 执行同步任务调用GTaskASyncTask实例的execute方法来启动异步的同步操作具体的同步逻辑应该在GTaskASyncTask类中实现。
mSyncTask.execute();
}
}
// 私有方法,用于取消正在进行的同步任务
private void cancelSync() {
// 判断当前是否存在正在执行的同步任务通过检查mSyncTask是否为null如果存在则调用其cancelSync方法来取消同步任务具体的取消逻辑同样要看GTaskASyncTask类中的实现。
if (mSyncTask!= null) {
mSyncTask.cancelSync();
}
}
// 重写Service类的onCreate方法该方法在服务第一次创建时被调用在这里将mSyncTask置为null确保服务每次启动时都处于初始状态没有遗留的同步任务相关对象。
@Override
public void onCreate() {
mSyncTask = null;
}
// 重写Service类的onStartCommand方法这个方法在每次通过startService方法启动服务或者有新的Intent传递给已经启动的服务时被调用用于处理服务启动相关的主要逻辑。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 从传入的Intent中获取附加的Bundle数据Bundle可以包含多个键值对形式的Extra数据通常用于在不同组件间传递各种参数信息这里可能包含了前面定义的表示同步动作类型等相关信息。
Bundle bundle = intent.getExtras();
// 判断获取到的Bundle是否不为null并且其中包含了前面定义的用于标识同步动作类型的键ACTION_STRING_NAME只有满足这个条件才进行后续的动作类型判断和相应逻辑处理。
if (bundle!= null && bundle.containsKey(ACTION_STRING_NAME)) {
// 根据获取到的同步动作类型的值进行switch分支判断以执行不同的操作逻辑。
switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) {
// 如果动作类型是开始同步ACTION_START_SYNC则调用startSync方法来启动同步任务。
case ACTION_START_SYNC:
startSync();
break;
// 如果动作类型是取消同步ACTION_CANCEL_SYNC则调用cancelSync方法来取消正在进行的同步任务。
case ACTION_CANCEL_SYNC:
cancelSync();
break;
// 如果是其他无法识别的动作类型(默认情况),则不执行任何特定操作,直接跳过。
default:
break;
}
// 返回START_STICKY表示服务在被系统强制终止后例如由于内存不足等原因会尝试重新创建并启动并且最后一次传入的Intent会再次传递给onStartCommand方法保证服务的持续性和对重要操作的重新执行能力。
return START_STICKY;
}
// 如果不满足前面的条件即没有有效的同步动作类型信息则调用父类Service的onStartCommand方法按照默认的行为处理启动相关逻辑。
return super.onStartCommand(intent, flags, startId);
}
// 重写Service类的onLowMemory方法该方法在系统内存不足时被调用用于让服务释放一些不必要的资源或者停止一些非关键的操作在这里如果存在正在执行的同步任务则调用cancelSync方法取消同步任务以释放相关资源避免对系统内存造成过大压力。
@Override
public void onLowMemory() {
if (mSyncTask!= null) {
mSyncTask.cancelSync();
}
}
// 重写Service类的onBind方法这个方法用于实现服务的绑定功能返回一个IBinder对象供客户端与服务进行交互通信如果服务不需要被绑定这里就是这种情况则返回null表示不支持绑定操作。
public IBinder onBind(Intent intent) {
return null;
}
// 公共方法,用于发送广播,向外部组件传达同步相关的状态信息(如是否正在同步、同步进度消息等)。
public void sendBroadcast(String msg) {
// 更新同步进度相关的消息字符串将传入的msg赋值给mSyncProgress外部组件可以通过获取这个字符串来了解同步的进展情况或者其他相关提示信息。
mSyncProgress = msg;
// 创建一个新的Intent对象设置其Action为前面定义的用于广播同步相关信息的GTASK_SERVICE_BROADCAST_NAME用于标识这个广播的用途和接收者可以通过这个Action来过滤和接收该广播。
Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME);
// 在Intent中添加一个Extra键为GTASK_SERVICE_BROADCAST_IS_SYNCING值为判断mSyncTask是否为null的结果即当前是否有正在进行的同步任务通过这个Extra向外部组件传递服务的同步状态信息。
intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask!= null);
// 在Intent中添加另一个Extra键为GTASK_SERVICE_BROADCAST_PROGRESS_MSG值为前面更新的同步进度消息字符串mSyncProgress用于向外部组件传递具体的同步进度相关文本信息。
intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg);
// 调用父类Service的sendBroadcast方法发送创建好的包含同步状态和进度信息的Intent广播让注册接收该广播的外部组件能够接收到这些信息并做出相应的处理。
sendBroadcast(intent);
}
// 静态公共方法用于从外部如Activity中方便地启动同步任务接收一个Activity对象作为参数通常用于在界面相关的组件中发起同步操作。
public static void startSync(Activity activity) {
// 通过GTaskManager的单例实例调用getInstance方法获取设置当前的Activity上下文可能在GTaskManager中需要用到这个上下文来进行一些与界面相关或者依赖上下文的操作具体要看GTaskManager类的实现
GTaskManager.getInstance().setActivityContext(activity);
// 创建一个新的Intent对象指定要启动的服务为当前的GTaskSyncService类用于启动这个服务来执行同步任务。
Intent intent = new Intent(activity, GTaskSyncService.class);
// 在Intent中添加一个Extra键为前面定义的ACTION_STRING_NAME值为表示开始同步的ACTION_START_SYNC告诉服务接收到这个Intent后要执行开始同步的操作。
intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC);
// 通过传入的Activity对象调用startService方法启动创建好的Intent对应的服务即启动GTaskSyncService来执行同步任务。
activity.startService(intent);
}
// 静态公共方法用于从外部可以是各种Context相关的组件如Activity、Service等方便地取消同步任务接收一个Context对象作为参数用于创建启动服务的Intent来通知服务取消同步操作。
public static void cancelSync(Context context) {
// 创建一个新的Intent对象指定要启动的服务为当前的GTaskSyncService类用于向这个服务发送取消同步的通知。
Intent intent = new Intent(context, GTaskSyncService.class);
// 在Intent中添加一个Extra键为前面定义的ACTION_STRING_NAME值为表示取消同步的ACTION_CANCEL_SYNC告诉服务接收到这个Intent后要执行取消同步的操作。
intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC);
// 通过传入的Context对象调用startService方法启动创建好的Intent对应的服务即通知GTaskSyncService取消正在进行的同步任务。
context.startService(intent);
}
// 静态公共方法用于外部组件查询当前是否有同步任务正在进行返回一个布尔值通过判断静态变量mSyncTask是否为null来确定是否有同步任务在执行中。
public static boolean isSyncing() {
return mSyncTask!= null;
}
// 静态公共方法用于外部组件获取当前的同步进度相关的消息字符串返回存储同步进度信息的静态变量mSyncProgress的值外部组件可以通过这个方法了解同步任务的进展情况或者其他相关提示信息。
public static String getProgressString() {
return mSyncProgress;
}
}