Android系统。背景工人线程。如何使它正常?

时间:2017-08-13 07:11:43

标签: android multithreading intentservice

我是android编程的新手,所以我的问题是基本的。 我需要使用后台进程进行应用程序,不断发送一些数据(从BT获取)。想法是即使应用程序处于后台或关闭,通信也应该有效。

我想我需要扩展IntentService而不是创建工作线程。比如当我需要向工作线程发送命令时,我应该在intent中使用其他参数启动intent服务,然后将消息发送到工作线程。

我尝试这样做,我遇到了从onHandleIntent()发送邮件的问题。

所以我的问题是:具有此类任务的应用程序的适当模型是什么?可能你知道可能会看到哪些例子?看起来我做了很常见的事情,但我找不到回答我问题的例子。

UPD:我做了原型工作。这是实现IntentService和工作线程的最佳方式吗?

公共类WorkIntentService扩展了IntentService {

public static final String TAG = WorkerThread.class.getSimpleName();

public static final String ACTION_START = TAG + "[action_start]";
public static final String ACTION_STOP = TAG + "[action_stop]";

public static final String MSG_STOP = TAG + "[message_stop]";

public WorkIntentService() {
    super("WorkIntentService");
    workerThread = null;
}

WorkerThread workerThread;

@Override
protected void onHandleIntent(Intent intent) {

    if (intent != null) {

        String sAction = intent.getAction();

        if(sAction == ACTION_START){

            if(workerThread == null) {
                workerThread = new WorkerThread();
                workerThread.start();
            }

        }
        else  if(sAction == ACTION_STOP){

            if(workerThread == null) {

                LocalBroadcastManager.getInstance(null)
                        .sendBroadcast(new Intent(MSG_STOP));
            }

        }

    }
}

private static int nCounter = 0;
private static long TIMEOUT = 1000;

private class WorkerThread extends Thread{

    long lCounter;
    public boolean bRun;

    public void run() {

        lCounter = System.currentTimeMillis();
        bRun = true;

        LocalBroadcastManager.getInstance(WorkIntentService.this).registerReceiver(
                new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {

                            bRun = false;
                    }
                },  new IntentFilter(MSG_STOP));

        while (bRun){

            if( System.currentTimeMillis() - lCounter > TIMEOUT ){
                lCounter = System.currentTimeMillis();
                Log.i(TAG, "next #" + Integer.toString(nCounter++));
            }

        }

    }

}

}

0 个答案:

没有答案