始终在Android上运行后台服务?

时间:2015-04-28 13:00:34

标签: android service background

我正在构建一个应用程序,它具有后台服务,可以持续与Raspberry Pi进行通信。

我正在使服务变粘(Service.START_STICKY),以便在被用户或操作系统杀死时重启。

这适用于前30-40分钟。 30-40分钟后,服务似乎停止了。

有没有办法避免这个问题?我知道如果在后台有连续服务的话,这对于batterylife来说是不好的。该应用程序在我自己的项目中用于自动化我的房间,仅供我使用。所以batterylife不是问题。

public class RaspberryPiCommunication extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //Do continuouswork here in a seperate thread
        return Service.START_STICKY;
    }
}

我还有另外一个关于服务的问题: 如果在以下示例中启动了两次服务,那么SomeObject()会有两个实例,并且doSomWork()在后台运行两次吗?

public class RaspberryPiCommunication extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        SomeObject obj = new SomeObject();
        obj.doSomeWork();
        return Service.START_STICKY;
    }
}

3 个答案:

答案 0 :(得分:0)

您是否在自己的线程上运行该服务?默认情况下,A服务在主线程上运行。对于像这样的长时间运行的任务,在一个单独的线程中运行它

Note that services, like other application objects, run in the main thread of their hosting process. This means that, if your service is going to do any CPU intensive (such as MP3 playback) or blocking (such as networking) operations, it should spawn its own thread in which to do that work.

服务只能在一个实例中运行。每次启动服务时都会调用onStartCommand()。

http://developer.android.com/guide/components/services.html#StartingAService

答案 1 :(得分:0)

这是必需的一段代码。

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    handler.postDelayed(runnable, 1000 );// 1000 - Milliseconds
    if (appContext == null) {
         appContext = getBaseContext();
        }
    Toast.makeText(appContext, "Services Started", Toast.LENGTH_SHORT).show();

    return START_STICKY;
}

Runnable runnable = new Runnable(){

    @Override
    public void run() {
        // TODO Auto-generated method stub

            DoBackgroundTasks();
            handler.postDelayed(this, 1000 ); // 1000 - Milliseconds


    }
 };
 void DoBackgroundTasks()
    {
       //write code here.
    }

答案 2 :(得分:0)

在您宣布服务的清单中,添加此

android:process="remote"