Android不可杀戮的后台服务

时间:2015-10-11 17:24:35

标签: java android multithreading service background

我正在编写一个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重新启动时,我读取文件中的数据将其解析为我的数据对象并继续我的工作。如果需要,还要做一些错误处理。

我不知道这是一个很好的解决方案,还是完全愚蠢但是有效。

感谢您的帮助,

克莱门

0 个答案:

没有答案