Tôi chỉ muốn gọi các phương thức của một dịch vụ địa phương từ hoạt động của mình. Làm thế nào tôi có thể làm điều đó ?Cách gọi các phương thức của Dịch vụ từ hoạt động?
Trả lời
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.
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.
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
@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
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ì.
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;
}
};
}
câu trả lời tuyệt vời ... – Opiatefuchs
nếu dịch vụ bị dừng, tôi có được gọi tới onServiceDisconnected không? –
tại sao nó quá khó khăn để gọi một fuction đơn giản –
- 1. Cách gọi phương thức hoạt động từ một dịch vụ
- 2. Cách gọi phương thức stopervice() của lớp Dịch vụ từ lớp hoạt động gọi
- 3. Phương thức hoạt động gọi từ Fragment
- 4. Cách gọi một Phương thức Dịch vụ Web?
- 5. Gọi phương thức web từ cùng một dịch vụ web
- 6. Cách gọi phương thức chạy dịch vụ windows
- 7. Phương thức khởi động của Dịch vụ WCF ở đâu?
- 8. Thực hiện gọi lại từ Dịch vụ đến Hoạt động
- 9. Gọi phương thức dịch vụ WCF thông qua trình duyệt
- 10. Gọi phương thức Phân đoạn từ hoạt động gốc
- 11. Gọi phương thức hoạt động từ lớp BroadcastReceiver
- 12. Lệnh gọi phương thức trong một dịch vụ Windows
- 13. Dịch vụ gọi lại cho hoạt động trong android
- 14. lấy tham chiếu của Hoạt động từ Dịch vụ
- 15. Cách khởi động dịch vụ Android từ một hoạt động và ngừng dịch vụ trong một hoạt động khác?
- 16. Truy cập Dịch vụ đang chạy và gọi phương thức của nó?
- 17. Ngăn chặn thanh tác vụ kích hoạt các dạng không phương thức khi hộp thoại phương thức hoạt động
- 18. cách gửi tin nhắn từ dịch vụ đến hoạt động
- 19. Gọi dịch vụ WCF từ jQuery Ajax sử dụng phương thức POST
- 20. Cách nhận dữ liệu từ dịch vụ đến hoạt động
- 21. Dịch vụ địa phương hoặc dịch vụ từ xa?
- 22. Cách request.getPathInfo() trong phương thức dịch vụ trả về null?
- 23. Trong Android: Cách gọi chức năng hoạt động từ một dịch vụ?
- 24. Không thể gọi phương thức dịch vụ web từ android emulator dự án
- 25. Cách gọi các dịch vụ RESTFUL từ GWT?
- 26. Gửi dữ liệu từ dịch vụ đến hoạt động Android
- 27. Cách gọi dịch vụ windows từ asp.net
- 28. Dịch vụ từ xa Vs. Dịch vụ địa phương
- 29. Cách tự động gọi phương thức của lớp trong .NET?
- 30. Phương thức hoạt động nào được gọi trước?
liên kết của bạn không hoạt động ... –
@RajaReddyPolamReddy cảm ơn! Tôi sửa nó rồi. –
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