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.
note/GTaskSyncService - 副本.java

198 lines
5.7 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 是一个后台服务用于管理Google任务GTask的同步操作。
* 它提供启动和取消同步的方法,并在同步过程中广播进度更新。
*/
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;
/**
* 广播名称,用于发送同步状态和服务消息。
*/
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() {
super.onCreate();
mSyncTask = null;
}
/**
* 当服务接收到启动命令时调用。
*/
@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() {
super.onLowMemory();
if (mSyncTask != null) {
mSyncTask.cancelSync();
}
}
/**
* 返回绑定到此服务的IBinder对象本服务不支持绑定所以返回null。
*/
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* 发送广播以通知其他组件当前同步的状态和进度。
*/
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);
}
/**
* 静态方法从Activity启动同步服务。
*/
public static void startSync(Activity activity) {
GTaskManager.getInstance().setActivityContext(activity);
Intent intent = new Intent(activity, GTaskSyncService.class);
intent.putExtra(ACTION_STRING_NAME, ACTION_START_SYNC);
activity.startService(intent);
}
/**
* 静态方法,通过上下文取消同步操作。
*/
public static void cancelSync(Context context) {
Intent intent = new Intent(context, GTaskSyncService.class);
intent.putExtra(ACTION_STRING_NAME, ACTION_CANCEL_SYNC);
context.startService(intent);
}
/**
* 检查是否有同步任务正在进行。
*/
public static boolean isSyncing() {
return mSyncTask != null;
}
/**
* 获取当前同步任务的进度信息。
*/
public static String getProgressString() {
return mSyncProgress;
}
}