一次又一次地开始服务,直到它被杀死

时间:2014-06-29 17:25:31

标签: android service lifecycle

一个简单的问题,只要服务生效/活动,如何在日志猫控制台上重复服务msg“hello”?我试过了:

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v("LocalService", "Received start id " + startId + ": " + intent);
        Mano lopas = new Mano(this);
        lopas.Lopas();
        while(true) {
        Log.v("HAHA", "hello");
        }
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        return START_STICKY;
    }

但它永远不会返回START_STICKY,实际上它甚至没有建立项目。我想我错过了一些关于服务的东西?我在应用程序的MainActivity中启动我的服务,例如:

startService(new Intent(getApplicationContext(),Myclass.class));

它在我的服务中没有我的while循环只运行一次。它告诉我Logcat中的一些东西,就是这样。更重要的是,我的服务开始这么多次,我重新打开我的应用程序。如何使服务开始运行一次并“永远”,我的意思是直到它被系统杀死或用户杀死它。

3 个答案:

答案 0 :(得分:0)

服务没有自己的线程,它们在UI线程上运行。如果您希望它并行运行,则需要创建一个Thread。所以在这里你应该在你的onStartCommand中创建一个Thread,那个线程应该做你想做的任何事情。

答案 1 :(得分:0)

同样,您可以在活动中定期记录某些内容:使用处理程序。发布记录消息的任务,并使用postDelayed(...)将自身重新发布到同一个Handler。取消活动的onPause()或您服务的onDestroy()中的待处理暂停执行。

请注意,在Android中显式创建Thread或使用像TimerTask这样的J2SE结构几乎没有充分的理由。对于重量级任务,请使用AsyncTask。对于轻量级任务,请使用处理程序。在您的情况下,创建一个新的线程将是一个非常重要的解决方案,你想做什么。

答案 2 :(得分:-1)

首先,不要忘记在你的清单中注册Service

这可以通过

来完成
<service android:enabled="true" android:name=".services.Paycan" />

接下来是,您的服务(如果它不是一个intentservice)在MainUI中运行。如果你创建一个无限循环,请确保它在后台线程中,否则它将冻结应用程序。

您可以使用Asynctask,一个使用onStartCommand创建并在onDestroy停用或使用IntentService代替Service的主题执行此操作

示例:

public class yourTestClass extends Service {

    Thread testThread;
    boolean threadRunning = false;

    @Override
    public void onCreate() {
        super.onCreate(); 
        testThread = new Thread() {
         @Override
         public void run() {
          try {
            while(threadRunning) {
                Thread.sleep(1000);
                Log.i("test", "....");
            }
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
       } 
     };
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
       threadRunning = true;
       testThread.start();
       return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        threadRunning = false;
    }