2012-06-10 41 views
2

我有一个奇怪的问题。我有一个ListView活动,并在onCreate中的Activity中启动一个服务。活动正在等待,直到服务完成

当我启动应用程序时,直到服务完成他的工作后才显示活动的布局。 =(Normaly服务应该做他的工作背景。

活动

import java.util.ArrayList; 
import java.util.HashMap; 
import android.app.Activity; 
import android.app.ActivityManager; 
import android.app.ActivityManager.RunningServiceInfo; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 

public class DealAlertMainActivity extends Activity { 

    ListView list; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     list = (ListView) findViewById(R.id.list); 

     //start service if its not running 
     if(isMyServiceRunning() == false) 
      startService(new Intent(DealAlertMainActivity.this, DealAlert_Service.class)); 
    } 

    @Override 
    public void onStart() 
    { 
     super.onStart(); 

     ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); 
     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put("keyword", "Test Keyword"); 
     map.put("title", "Test Title"); 
     mylist.add(map); 
     map = new HashMap<String, String>(); 
     map.put("keyword", "Test Keyword 2"); 
     map.put("title", "Test Title 2"); 
     mylist.add(map); 

     SimpleAdapter feeds_list = new SimpleAdapter(this, mylist, R.layout.listview_item, 
        new String[] {"keyword", "title"}, new int[] {R.id.Keyword, R.id.Title}); 
     list.setAdapter(feeds_list); 

    } 

... 

} 

服务

import java.util.ArrayList; 

import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 


public class DealAlert_Service extends Service { 

    private NotificationManager mNM; 

    public void onCreate() 
    { 
     super.onCreate(); 

     mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
    } 





    public int onStartCommand(Intent intent, int flags, int startId) { 

     //Do work 

     } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

谢谢您的帮助!

回答

0

服务在后台自动为从UI的角度来看,它们是而不是在线程背景下自动处于在主应用程序线程上调用,并且您的UI将被冻结,但要花费很长的时间完成onStartCommand()。因此,服务需要完成的任何重要工作都需要在后台线程中完成,不管它是您自己创建的还是通过切换到IntentService而获得的。

+0

你确定吗?因为我有另一个应用程序,我使用相同的代码,它运作良好。 :O那么我应该在哪里使用后台线程?在Acitvity或服务中,你觉得它更好? – Stefan

+0

@Stefan:“你确定吗?” - 是的。 “因为我有另一个应用程序,我使用相同的代码,它运作良好。” - 你在'onStartCommand()'中做的工作要么很快,要么使用后台线程。 “在Acitvity或服务中,你觉得它更好?” - 我无法回答,抱歉。 – CommonsWare

+0

好的,但是,谢谢,我现在与IntentService一起工作! – Stefan