|
|
|
@ -0,0 +1,216 @@
|
|
|
|
|
/**
|
|
|
|
|
* @ProiectName:MiNote
|
|
|
|
|
* @Package: gtask.remote
|
|
|
|
|
* @ClassName: GTaskASyncTask
|
|
|
|
|
* @Description:GTaskASyncTask类是一个异步任务类,用于执行后台任务并在UI线程更新相关的UI组件。
|
|
|
|
|
* 其功能包括1.后台任务的执行:例如从服务器获取数据、执行文件读写操作等。这些任务将在后台线程中执行,避免在UI线程中执行耗时操作而阻塞UI响应。
|
|
|
|
|
* 2.进度更新和反馈:在任务执行过程中,GTaskASyncTask类可以通过调用publishProgress()方法更新任务的进度,
|
|
|
|
|
* 并且在UI线程中回调onProgressUpdate()方法,以便更新相关的UI组件
|
|
|
|
|
* 3.结果返回和处理:当任务执行完成后,GTaskASyncTask类会将执行结果返回给UI线程,并在UI线程中回调onPostExecute()方法。
|
|
|
|
|
* 在该方法中,可以根据任务执行结果更新UI组件、执行其他操作或显示提示信息。
|
|
|
|
|
* @Author: wmq
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package net.micode.notes.gtask.remote;
|
|
|
|
|
|
|
|
|
|
import android.app.Notification;
|
|
|
|
|
import android.app.NotificationManager;
|
|
|
|
|
import android.app.PendingIntent;
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
import android.content.Intent;
|
|
|
|
|
import android.os.AsyncTask;
|
|
|
|
|
|
|
|
|
|
import net.micode.notes.R;
|
|
|
|
|
import net.micode.notes.ui.NotesListActivity;
|
|
|
|
|
import net.micode.notes.ui.NotesPreferenceActivity;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @功能名: 定义名为GTaskASyncTask的类,并声明了一些成员变量和内部接口
|
|
|
|
|
* @参数 :
|
|
|
|
|
* mContext:上下文对象,用于获取系统服务。
|
|
|
|
|
* mNotifiManager:通知管理器,用于发送通知。
|
|
|
|
|
* mTaskManager:GTaskManager的实例,用于管理任务。
|
|
|
|
|
* mOnCompleteListener:任务完成的回调接口。
|
|
|
|
|
* @功能描述:通过在GTaskASyncTask类中声明这些成员变量和内部接口,
|
|
|
|
|
* 可以在异步任务的执行过程中使用上下文、通知管理器和任务管理器等资源,
|
|
|
|
|
* 并在任务完成时回调通知调用者。这样可以更好地管理和控制异步任务的执行,并提供灵活的任务完成回调机制。
|
|
|
|
|
* @实现过程:
|
|
|
|
|
* @Author: wmq
|
|
|
|
|
*/
|
|
|
|
|
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {//执行的任务可以接收Void类型的输入参数,发布String类型的进度信息,最终返回Integer类型的结果。
|
|
|
|
|
|
|
|
|
|
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;//静态变量,用于标识通知的ID。通常用于发送通知时唯一标识通知的标识符。
|
|
|
|
|
|
|
|
|
|
public interface OnCompleteListener {//内部接口,定义了一个回调方法onComplete()。当任务完成时,可以通过实现该接口,在任务完成时进行回调通知。
|
|
|
|
|
void onComplete();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Context mContext;
|
|
|
|
|
|
|
|
|
|
private NotificationManager mNotifiManager;
|
|
|
|
|
|
|
|
|
|
private GTaskManager mTaskManager;
|
|
|
|
|
|
|
|
|
|
private OnCompleteListener mOnCompleteListener;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @功能名: GTaskASyncTask
|
|
|
|
|
* @参数 : context/listener
|
|
|
|
|
* @功能描述: 是本类的构造函数,)接收一个上下文对象作为参数,并在构造函数内部进行了一些初始化操作
|
|
|
|
|
* @实现过程: 见每一行后面
|
|
|
|
|
* @Author: wmq
|
|
|
|
|
*/
|
|
|
|
|
public GTaskASyncTask(Context context, OnCompleteListener listener) {
|
|
|
|
|
mContext = context; //将传入的OnCompleteListener接口的实例赋值给成员变量mOnCompleteListener。用于在任务完成时回调通知调用者。
|
|
|
|
|
mOnCompleteListener = listener;
|
|
|
|
|
mNotifiManager = (NotificationManager) mContext
|
|
|
|
|
.getSystemService(Context.NOTIFICATION_SERVICE);//通过上下文对象获取通知管理器的实例。该通知管理器用于发送通知。
|
|
|
|
|
mTaskManager = GTaskManager.getInstance();//:通过调用GTaskManager类的静态方法getInstance()获取GTaskManager的单例实例。mTaskManager用于管理任务的执行。
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* @功能名: cancelSync()
|
|
|
|
|
* @参数 :
|
|
|
|
|
* @功能描述: 取消正在进行的同步任务
|
|
|
|
|
* @实现过程: 通过调用mTaskManager的cancelSync()方法来取消同步任务
|
|
|
|
|
* 某些情况下,用户需要停止或取消当前正在执行的任务,例如用户手动取消了同步操作或者发生了异常情况需要终止任务
|
|
|
|
|
* @Author: wmq
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
public void cancelSync() {
|
|
|
|
|
mTaskManager.cancelSync();
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* @功能名: publishProgess
|
|
|
|
|
* @参数 :message
|
|
|
|
|
* @功能描述: 用于发布任务执行的进度信息,在异步任务的执行过程中,有时需要将一些进度信息反馈给用户,
|
|
|
|
|
* 可以通过调用publishProgress()方法来实现。该方法会在UI线程调用onProgressUpdate()方法,从而更
|
|
|
|
|
* 新UI界面上的进度信息。
|
|
|
|
|
* @实现过程: publishProgess方法重载了AsyncTask类中的publishProgress()方法,
|
|
|
|
|
* 并将传入的message作为进度信息进行发布。这样,外部调用者就可以通过调用GTaskASyncTask
|
|
|
|
|
* 对象的publishProgess()方法来发布任务的执行进度信息,从而实现任务进度的实时反馈。
|
|
|
|
|
* @Author: wmq
|
|
|
|
|
*/
|
|
|
|
|
public void publishProgess(String message) {// 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值
|
|
|
|
|
publishProgress(new String[] {
|
|
|
|
|
message
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* private void showNotification(int tickerId, String content) {
|
|
|
|
|
Notification notification = new Notification(R.drawable.notification, mContext
|
|
|
|
|
.getString(tickerId), System.currentTimeMillis());
|
|
|
|
|
notification.defaults = Notification.DEFAULT_LIGHTS;
|
|
|
|
|
notification.flags = Notification.FLAG_AUTO_CANCEL;
|
|
|
|
|
PendingIntent pendingIntent;
|
|
|
|
|
if (tickerId != R.string.ticker_success) {
|
|
|
|
|
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
|
|
|
|
|
NotesPreferenceActivity.class), 0);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
|
|
|
|
|
NotesListActivity.class), 0);
|
|
|
|
|
}
|
|
|
|
|
//notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
|
|
|
|
|
// pendingIntent);
|
|
|
|
|
notification.contentIntent = pendingIntent;
|
|
|
|
|
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
|
|
|
|
|
}*/
|
|
|
|
|
/**
|
|
|
|
|
* @功能名: showNotification
|
|
|
|
|
* @参数 :int tickerId / String content
|
|
|
|
|
* @功能描述:
|
|
|
|
|
* 根据传入的tickerId参数判断通知的类型:
|
|
|
|
|
* 使用Notification.Builder类来构建通知:
|
|
|
|
|
* 通过调用builder.getNotification()方法获取构建的通知对象;
|
|
|
|
|
* 最后使用mNotifiManager.notify()方法发送通知
|
|
|
|
|
* @实现过程: 如果tickerId不等于R.string.ticker_success(即不是成功的通知),则创建一个将跳转到
|
|
|
|
|
* NotesPreferenceActivity类的PendingIntent对象。如果tickerId等于R.string.ticker_success
|
|
|
|
|
* (即成功的通知),则创建一个将跳转到NotesListActivity类的PendingIntent对象。
|
|
|
|
|
* @Author: wmq
|
|
|
|
|
*/
|
|
|
|
|
private void showNotification(int tickerId, String content) {
|
|
|
|
|
|
|
|
|
|
PendingIntent pendingIntent;
|
|
|
|
|
|
|
|
|
|
if (tickerId != R.string.ticker_success) {
|
|
|
|
|
|
|
|
|
|
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
|
|
|
|
|
|
|
|
|
|
NotesPreferenceActivity.class), 0);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
|
|
|
|
|
|
|
|
|
|
NotesListActivity.class), 0);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Notification.Builder builder = new Notification.Builder(mContext)
|
|
|
|
|
|
|
|
|
|
.setAutoCancel(true) //设置通知点击后自动取消
|
|
|
|
|
|
|
|
|
|
.setContentTitle(mContext.getString(R.string.app_name))//设置通知的标题为应用名称。
|
|
|
|
|
|
|
|
|
|
.setContentText(content)//设置通知的内容为传入的content参数。
|
|
|
|
|
|
|
|
|
|
.setContentIntent(pendingIntent)//设置通知点击时的跳转意图为之前创建的PendingIntent对象。
|
|
|
|
|
|
|
|
|
|
.setWhen(System.currentTimeMillis())//时间设置
|
|
|
|
|
|
|
|
|
|
.setOngoing(true);//用户无法手动清除
|
|
|
|
|
|
|
|
|
|
Notification notification=builder.getNotification();
|
|
|
|
|
|
|
|
|
|
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//将通知显示在系统通知栏中。其中GTASK_SYNC_NOTIFICATION_ID作为通知的ID,可以用于标识该通知。
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @功能名: doInBackground
|
|
|
|
|
* @参数 : unused
|
|
|
|
|
* @功能描述: 用于在后台执行耗时操作,如网络请求、数据库查询等任务。
|
|
|
|
|
* @实现过程: @Override注解表示该方法是对父类(AsyncTask)中的方法进行重写
|
|
|
|
|
*在执行过程中可以调用publishProgress()方法来更新异步任务的执行进度。
|
|
|
|
|
*最后返回同步操作的结果,通常是一个代表同步状态的整数值。
|
|
|
|
|
* @Author: wmq
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
protected void onProgressUpdate(String... progress) {
|
|
|
|
|
showNotification(R.string.ticker_syncing, progress[0]);
|
|
|
|
|
if (mContext instanceof GTaskSyncService) {
|
|
|
|
|
((GTaskSyncService) mContext).sendBroadcast(progress[0]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @功能名: onPostExecute
|
|
|
|
|
* @参数 : result
|
|
|
|
|
* @功能描述: 用于在后台操作完成后执行一些操作,通常是更新UI界面或者执行回调函数。
|
|
|
|
|
* @实现过程: 利用result进行不同状态的判断,并执行相应的方法,具体在下面标注
|
|
|
|
|
* @Author: wmq
|
|
|
|
|
*/
|
|
|
|
|
@Override //表示该方法是对父类(AsyncTask)中的方法进行重写
|
|
|
|
|
protected void onPostExecute(Integer result) { //这表示该方法接收一个Integer类型的参数result,表示后台操作的结果。
|
|
|
|
|
if (result == GTaskManager.STATE_SUCCESS) { //表示同步操作成功,那么会显示一个通知,更新上次同步时间,并执行NotesPreferenceActivity.setLastSyncTime()方法保存最新的同步时间。
|
|
|
|
|
showNotification(R.string.ticker_success, mContext.getString(
|
|
|
|
|
R.string.success_sync_account, mTaskManager.getSyncAccount()));
|
|
|
|
|
NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis());
|
|
|
|
|
} else if (result == GTaskManager.STATE_NETWORK_ERROR) { //表示网络错误,会显示一个通知,提示同步时发生网络错误。
|
|
|
|
|
showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network));
|
|
|
|
|
} else if (result == GTaskManager.STATE_INTERNAL_ERROR) { //表示内部错误,会显示一个通知,提示同步时发生内部错误。如果result等于
|
|
|
|
|
showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal));
|
|
|
|
|
} else if (result == GTaskManager.STATE_SYNC_CANCELLED) { //表示同步被取消,会显示一个通知,提示同步被取消。
|
|
|
|
|
showNotification(R.string.ticker_cancel, mContext
|
|
|
|
|
.getString(R.string.error_sync_cancelled));
|
|
|
|
|
}
|
|
|
|
|
if (mOnCompleteListener != null) { //如果存在mOnCompleteListener回调函数对象,会在新的线程中执行mOnCompleteListener.onComplete()方法。
|
|
|
|
|
new Thread(new Runnable() {
|
|
|
|
|
|
|
|
|
|
public void run() {
|
|
|
|
|
mOnCompleteListener.onComplete();
|
|
|
|
|
}
|
|
|
|
|
}).start();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|