Tôi đã suy nghĩ về điều này gần đây khi triển khai account authenticators với luồng ủy quyền ba bên. Gửi kết quả trở lại dịch vụ để xử lý hoạt động tốt hơn xử lý nó trong hoạt động. Nó cũng cung cấp một sự phân tách mối quan tâm tốt hơn.
Nó không phải là tài liệu rõ ràng, nhưng Android cung cấp một cách dễ dàng để gửi và nhận kết quả ở bất cứ nơi nào (bao gồm cả dịch vụ) với ResultReceiver
.
Tôi thấy nó sạch hơn nhiều so với các hoạt động xung quanh, vì điều đó luôn đi kèm với nguy cơ rò rỉ các hoạt động đó. Ngoài ra, gọi các phương thức cụ thể ít linh hoạt hơn.
Để sử dụng ResultReceiver
trong một dịch vụ, bạn sẽ cần phải phân lớp nó và cung cấp một cách để xử lý các kết quả nhận được, thường trong một lớp bên trong:
public class SomeService extends Service {
/**
* Code for a successful result, mirrors {@link Activity.RESULT_OK}.
*/
public static final int RESULT_OK = -1;
/**
* Key used in the intent extras for the result receiver.
*/
public static final String KEY_RECEIVER = "KEY_RECEIVER";
/**
* Key used in the result bundle for the message.
*/
public static final String KEY_MESSAGE = "KEY_MESSAGE";
// ...
/**
* Used by an activity to send a result back to our service.
*/
class MessageReceiver extends ResultReceiver {
public MessageReceiver() {
// Pass in a handler or null if you don't care about the thread
// on which your code is executed.
super(null);
}
/**
* Called when there's a result available.
*/
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
// Define and handle your own result codes
if (resultCode != RESULT_OK) {
return;
}
// Let's assume that a successful result includes a message.
String message = resultData.getString(KEY_MESSAGE);
// Now you can do something with it.
}
}
}
Khi bạn bắt đầu một hoạt động trong dịch vụ, tạo một máy thu kết quả và đóng gói nó vào extras ý:
/**
* Starts an activity for retrieving a message.
*/
private void startMessageActivity() {
Intent intent = new Intent(this, MessageActivity.class);
// Pack the parcelable receiver into the intent extras so the
// activity can access it.
intent.putExtra(KEY_RECEIVER, new MessageReceiver());
startActivity(intent);
}
và cuối cùng, trong hoạt động, giải nén các máy thu và sử dụng ResultReceiver#send(int, Bundle)
để gửi kết quả trở lại.
Bạn có thể gửi kết quả là bất cứ lúc nào, nhưng ở đây tôi đã chọn để làm điều đó trước khi kết thúc:
public class MessageActivity extends Activity {
// ...
@Override
public void finish() {
// Unpack the receiver.
ResultReceiver receiver =
getIntent().getParcelableExtra(SomeService.KEY_RECEIVER);
Bundle resultData = new Bundle();
resultData.putString(SomeService.KEY_MESSAGE, "Hello world!");
receiver.send(SomeService.RESULT_OK, resultData);
super.finish();
}
}
Nó có thể đạt được với một hack đơn giản, bằng cách sử dụng SharedPreferences, [SO] (http://stackoverflow.com/a/31461941/4859873) –