2011-01-30 75 views

回答

1

做到這一點的一種方法是定義一個接口Android's AIDL並利用Binder子系統來執行IPC。在我發佈的鏈接上有一組很棒的說明。我會從那裏開始,然後在這裏發帖,如果你有問題。儘管是一個非常複雜的主題(IPC)Android和Binder做了一個非常好的工作,使其非常簡單(至少要開始,我敢肯定,如果你想,可以使它變得複雜;-))

編輯正如在評論中指出的那樣,如果Service和客戶端在相同的進程中運行,這是不必要的。除非您另行指定,否則這是默認設置。但是,它仍然可以工作,它只會增加一點複雜性。

+0

你的鏈接不工作... – 2013-02-12 09:33:34

0

我不知道你的問題在哪裏,請張貼一些代碼。 使用活頁夾,活動可以訪問服務對象。請參閱API中的示例以創建活動和服務之間的連接。

在您的活動中擁有服務對象,您可以簡單地調用:
mService.yourMethod();
如果您確切地描述您的問題,並且正如我所說,發佈一些片段,我們可以幫助您更好。

+4

你爲什麼不把一些鏈接到有用的資源?發佈一些關於如何綁定服務並隨後調用其方法的框架片段? :) – Juri 2011-01-30 20:44:45

+0

@Juri http://stackoverflow.com/questions/1916253/bind-service-to-activity-in-android無處它被鏈接 – CrandellWS 2017-01-13 12:42:09

35

下面是一個例子,這可能有助於
Server.java:

package com.example.bindservice.binder; 

import java.text.SimpleDateFormat; 
import java.util.Date; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.IBinder; 

public class Server extends Service { 

    IBinder mBinder = new LocalBinder(); 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 

    public class LocalBinder extends Binder { 
     public Server getServerInstance() { 
      return Server.this; 
     } 
    } 

    public String getTime() { 
     SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     return mDateFormat.format(new Date()); 
    } 
} 

Client.java

package com.example.bindservice.binder; 

import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.example.bindservice.binder.Server.LocalBinder; 

public class Client extends Activity { 

    boolean mBounded; 
    Server mServer; 
    TextView text; 
    Button button; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     text = (TextView)findViewById(R.id.text); 
     button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       text.setText(mServer.getTime()); 
      } 
     }); 
    } 

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

     Intent mIntent = new Intent(this, Server.class); 
     bindService(mIntent, mConnection, BIND_AUTO_CREATE); 
    }; 

    ServiceConnection mConnection = new ServiceConnection() { 
     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      Toast.makeText(Client.this, "Service is disconnected", 1000).show(); 
      mBounded = false; 
      mServer = null; 
     } 

     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      Toast.makeText(Client.this, "Service is connected", 1000).show(); 
      mBounded = true; 
      LocalBinder mLocalBinder = (LocalBinder)service; 
      mServer = mLocalBinder.getServerInstance(); 
     } 
    }; 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if(mBounded) { 
      unbindService(mConnection); 
      mBounded = false; 
     } 
    }; 
} 
相關問題