2011-01-30 27 views

Trả lời

1

Một cách để làm điều này là xác định giao diện với Android's AIDL và sử dụng hệ thống con Binder để thực hiện IPC. Có một bộ hướng dẫn tuyệt vời tại liên kết tôi đã đăng. Tôi sẽ bắt đầu ở đó và sau đó đăng ở đây nếu bạn có câu hỏi. Mặc dù là một chủ đề khá phức tạp (IPC) Android và các Binder làm một công việc thực sự tốt làm cho nó khá chết đơn giản (ít nhất là để bắt đầu, tôi chắc chắn bạn có thể làm cho nó phức tạp nếu bạn muốn ;-))

Chỉnh sửa Như được chỉ ra trong các nhận xét, điều này là không cần thiết nếu Service và ứng dụng khách đang chạy trong cùng một quá trình. Trừ khi bạn chỉ định khác, đây là mặc định. Tuy nhiên, nó vẫn hoạt động bất kể, nó chỉ thêm một chút phức tạp hơn.

+0

liên kết của bạn không hoạt động ... –

+0

@RajaReddyPolamReddy cảm ơn! Tôi sửa nó rồi. –

+1

Chỉ cần có AIDL nếu dịch vụ và hoạt động có trong các ứng dụng khác nhau. Nếu dịch vụ và hoạt động của bạn là địa phương đối với ứng dụng của bạn (đây là trường hợp phổ biến), hãy xem câu trả lời của @hackbod – odedfos

0

Tôi không biết vấn đề của bạn ở đâu, vui lòng đăng một số mã. Sử dụng một Chất kết dính, Hoạt động có thể có quyền truy cập vào đối tượng dịch vụ. Xem các ví dụ trong API để tạo kết nối giữa hoạt động và dịch vụ.

Có đối tượng dịch vụ trong hoạt động của bạn, bạn chỉ cần gọi:
mService.yourMethod();
Chúng tôi có thể giúp bạn tốt hơn rất nhiều nếu bạn mô tả chính xác vấn đề của mình và như tôi đã nói, đăng một số đoạn trích.

+4

tại sao bạn không đặt một số liên kết đến các tài nguyên hữu ích? Đăng một số đoạn mã về cách liên kết dịch vụ và gọi phương thức của nó sau đó? :) – Juri

+0

@Juri http://stackoverflow.com/questions/1916253/bind-service-to-activity-in-android ra khỏi hư không nó được liên kết – CrandellWS

24

Có mẫu mã cho quyền này trong tài liệu dịch vụ, dưới "Mẫu Dịch vụ địa phương":

http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

Ngoài ra đối với những người gợi ý aidl - nếu dịch vụ và khách hàng của bạn đều là một phần của bạn riêng .apk và chạy trong cùng một quá trình (hành vi mặc định), không cần thiết cho aidl; nó chỉ phức tạp hơn mà không cung cấp cho bạn bất cứ điều gì.

35

Dưới đây là một ví dụ có thể giúp
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; 
     } 
    }; 
} 
+0

câu trả lời tuyệt vời ... – Opiatefuchs

+0

nếu dịch vụ bị dừng, tôi có được gọi tới onServiceDisconnected không? –

+9

tại sao nó quá khó khăn để gọi một fuction đơn giản –

Các vấn đề liên quan