/* * 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; } }