2010-11-19 52 views
5

我寫了一個android程序:有一個UI的主要活動,它啓動一個服務。該服務及時回調UI活動以更新視圖。它工作正常,除非:如果活動已關閉(使用BACK)並重新開始,服務也將重新啓動(服務播放音頻文件,因此有兩個重疊的聲音)。 我使用bindService和BIND_AUTO_CREATE標誌來啓動並連接到服務。根據該文件,它應該只在不存在的情況下創建服務,但顯然它會在第二次打開時啓動另一個實例。 我想要的只是當活動關閉時,服務繼續運行,當活動再次打開時,它可以重新連接到服務。那可能嗎?或者我誤解了服務的用法?爲什麼遠程服務在主要活動關閉時被破壞?

試過更多: 在bindService Intent中使用ICountService(在.aidl中描述)而不是CountService。當活動關閉時,onDestroyed被調用。

下面是服務創建代碼,如果有幫助。

ServiceConnection conn = new ServiceConnection(){ 
    @Override 
    public void onServiceConnected(ComponentName c, IBinder b) { 
     Log.d("TK","Connected"); 
     //binder = (ICountService.Stub) b; 
     service = ICountService.Stub.asInterface(b); 
     try { 
      service.setCallback(new ICountCallback.Stub(){ 

       @Override 
       public void alert() { 
        Log.d("TK","alert!"); 
       } 

       @Override 
       public void updateTime(final int sec) { 
        handler.post(new Runnable(){ 

         @Override 
         public void run() { 
                  indicator.setText(toText(sec)); 
         } 

        }); 
       }    
      }); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName c) { 
     Log.d("TK","Disconnected"); 
    }   
}; 

private void startCountService(){ 
    Intent i = new Intent(ICountService.class.getName()); 
    boolean ok = context.bindService(i, conn, Context.BIND_AUTO_CREATE); 
    Log.d("TK", "bindService="+ok); 
} 

回答

7

根據該文件,它應該創建服務只有當它不存在,但很明顯,它開始打開第二遍的時候另一個實例。

bindService()將在服務未運行時創建服務實例。 unbindService()將銷燬服務實例,如果沒有其他綁定連接,並且沒有人調用startService()。如果服務在unbindService()上被銷燬,則隨後的bindService()將創建新的服務實例。

恕我直言,理想情況下,unbindService()不會立即銷燬服務,但讓它苟延殘喘了幾秒鐘第一,萬一出現的unbindService()後不久bindService()。但是,這不是他們如何實施它。

所有我想要的是當活動關閉時,服務繼續運行,當活動再次打開時,它可以重新連接到服務。

您應該使用startService()stopService(),而不是(或可以想象除)bindService()unbindService()

+0

感謝。啓動/停止服務不起作用。我嘗試了更多,並發現當活動關閉時調用服務(CountService.onDestroy被調用)。現在的問題是:如何防止服務被破壞? – Reno 2010-11-20 08:19:11

+0

@Reno:使用'startService()'。相信與否,它確實有效。 – CommonsWare 2010-11-20 13:14:21

+0

謝謝。它終於開始工作了。現在我使用像這樣:當啓動活動,1)startService,2)bindService沒有BIND_AUTO_CREATE;當停止活動,只是unbindService,沒有stopService – Reno 2010-11-23 14:43:25

-2

這是爲我工作。

Main.java

public class Main extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     startService(new Intent(Main.this, MyService.class)); 

     try{ 

      MyService.setMainActivity(this); 

     }catch(Exception e){ 

      //t.setText(e.getMessage()); 

     } 
    } 
} 

MyService.java

public class MyService extends Service { 
    private Context ctx; 
    public static Main main; 
     @Override public IBinder onBind(Intent intent) {   
     // TODO Auto-generated method stub  
     return null; 
    }  

    public void onCreate() 
    { 
     super.onCreate(); 
     ctx = this; 
     startService(); 
    } 

    @Override public void onDestroy() {   
     // TODO Auto-generated method stub  
     Log.d("ASAS","Destroy"); 
     super.onDestroy(); 
    } 

    public static void setMainActivity(Main activity) { 
     main = activity; 
    } 

    private void startService() 
    {   
     //timer.scheduleAtFixedRate(new checkdata(),0,30000); 
    } 
} 
+1

應該添加一些解釋,使答案更有幫助。 – 2012-10-20 07:57:03

+0

請爲以上代碼添加註釋。 – SoH 2014-01-08 08:42:32