我正在编写一个Android应用程序,这个应用程序有一个后台服务,它会重做"重"工作(所以工作时间很长)。 我将此服务作为远程服务运行,因此通信由AIDL完成。
因此,如果我关闭应用程序(通过按后退或主页按钮),服务启动的所有线程/处理程序也将被终止。显然,我不希望这种情况发生,因为这项工作必须完成。
以下是源代码中的importend部分:
MyService.java
public class MyService extends Service {
/*variables and stuff*/
private final BlockedUserList blockedUserList = new BlockedUserList(this);
// my AIDL-Interface
private final ILoginServiceRemote.Stub binder = new ILoginServiceRemote.Stub() {
// in this method the magic happens and the task will be started
@Override
public boolean login(int id, String passwordHash, String dbPasswordHash) throws RemoteException {
if (!passwordHash.equals(dbPasswordHash)) {
blockedUserList.add(id);
return false;
}
blockedUserList.remove(id);
return true;
}
// other stuff...
};
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
return true;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
}
MyHandler.java
public class MyHandler extends Handler {
/*variables and constructor*/
@Override
public void handleMessage(Message msg) {
long lastSystemTime = SystemClock.elapsedRealtime();
Intent intent = new Intent(MyService.INTENT_ACTION);
do {
/*do stuff*/
Log.d(getClass().getSimpleName(), Integer.toString(taskRemainingTime));
getApplicationContext.sendBroadcast(intent);
SystemClock.sleep(MyService.SLEEP_TIME);
} while (taskRemainingTime > 0);
}
}
MyUser.java
public class MyUser {
/*variables and stuff*/
private HandlerThread handlerThread;
private Handler handler;
private Looper looper;
public MyUser() {
// got this from the android docs
handlerThread = new HandlerThread(Integer.toHexString(id), HandlerThread.NORM_PRIORITY);
handlerThread.start();
looper = handlerThread.getLooper();
handler = new MyHandler(this, looper);
}
public void increaseTries() {
boolean start = false;
/*
do fancy stuff and set start to true...
*/
if (start) {
// start the "heavy" work
handler.sendEmptyMessage(0);
}
}
}
那么,如果我在activity.onDestroy()中调用unbind,为什么要重置我的服务呢?
我该如何防止这种情况?显然这是可能的,因为几乎每个音乐播放器都运行后台服务,即使您从最近的列表中删除应用程序也会继续播放音乐。 我试过了#34;正常"线程,AsyncTask和Timer但是如果我从最近的列表中删除我的应用程序就会被杀死。
所以不幸的是,无法在后台无限运行服务。所以我必须使用"解决方法"解决这个问题。
我是这样做的:
当Android调用onUnbind
时,我将importend数据序列化为JSON并创建哈希。然后我将这两个字符串写入SharedPrefs
。当服务通过START_STICKY
中的onStartCommand
重新启动时,我读取文件中的数据将其解析为我的数据对象并继续我的工作。如果需要,还要做一些错误处理。
我不知道这是一个很好的解决方案,还是完全愚蠢但是有效。
感谢您的帮助,
克莱门