hệ với chúng tôi các gói bên trong ý định không phải là về bảo mật, đó là bởi vì những kẻ Android đã làm cho nó theo cách đơn giản và đơn giản. Theo ý kiến của tôi bằng cách sử dụng bó và ý định để vượt qua các đối tượng lớn hơn không phải là một ý tưởng tốt. nó trở nên quá phức tạp để thực hiện, làm cho đối tượng trở nên nguyên thủy (khi sử dụng có thể chuyển nhượng) và cũng tạo một bản sao ở phía bên kia trong bộ nhớ (bạn lấy một đối tượng, đặt mọi thứ bên trong ý định và sau đó tạo lại nó phía bên kia tạo ra một bản sao mới ra khỏi nó) mà cho các đối tượng có một dấu chân bộ nhớ lớn hơn là không tốt.
tôi sẽ đề nghị:
- hoặc sử dụng một cửa hàng singleton
- Sử dụng lớp ứng dụng (mà cũng hoạt động như một singleton)
Tôi thường sử dụng một singleton trong đó có một HashMap bên trong nơi một phím số nguyên được tạo ra bởi tôi (từ Integer nguyên tử) và một đối tượng được đặt bên trong bản đồ. Bạn chỉ cần gửi ID bên trong ý định như một phần bổ sung và lấy nó ở phía bên kia bằng cách lấy chìa khóa từ ý định và truy cập singleton của bạn để lấy và loại bỏ đối tượng (từ bản đồ đó) và sử dụng nó trong hoạt động/dịch vụ mới của bạn.
Dưới đây là một mẫu của một cái gì đó như thế này:
(Lưu ý: đây là một phần từ lib của tôi cho các yêu cầu còn lại (https://github.com/darko1002001/android-rest-client) trong trường hợp bạn muốn xem thêm chi tiết về cách mọi thứ được triển khai). trong trường hợp của bạn, bạn sẽ cần phải loại bỏ một số mã và thay thế nó bằng của riêng bạn, nhưng ý tưởng chung là như nhau.
/**
* @author Darko.Grozdanovski
*/
public class HttpRequestStore {
public static final String TAG = HttpRequestStore.class.getSimpleName();
public static final String KEY_ID = "id";
public static final String IS_SUCCESSFUL = "isSuccessful";
private static final HashMap<Integer, RequestWrapper> map = new HashMap<Integer, RequestWrapper>();
private final AtomicInteger counter = new AtomicInteger();
private static Class<?> executorServiceClass = HTTPRequestExecutorService.class;
private final Context context;
private static HttpRequestStore instance;
private HttpRequestStore(final Context context) {
this.context = context;
}
public static HttpRequestStore getInstance(final Context context) {
if (instance == null) {
instance = new HttpRequestStore(context.getApplicationContext());
}
return instance;
}
public static void init(final Class<?> executorServiceClass) {
HttpRequestStore.executorServiceClass = executorServiceClass;
}
public Integer addRequest(final RequestWrapper block) {
return addRequest(counter.incrementAndGet(), block);
}
public Integer addRequest(final Integer id, final RequestWrapper block) {
map.put(id, block);
return id;
}
public void removeBlock(final Integer id) {
map.remove(id);
}
public RequestWrapper getRequest(final Integer id) {
return map.remove(id);
}
public RequestWrapper getRequest(final Intent intent) {
final Bundle extras = intent.getExtras();
if (extras == null || extras.containsKey(KEY_ID) == false) {
throw new RuntimeException("Intent Must be Filled with ID of the block");
}
final int id = extras.getInt(KEY_ID);
return getRequest(id);
}
public Integer launchServiceIntent(final HttpRequest block) {
return launchServiceIntent(block, null);
}
public Integer launchServiceIntent(final HttpRequest block, RequestOptions options) {
if (executorServiceClass == null) {
throw new RuntimeException("Initialize the Executor service class in a class extending application");
}
if (isServiceAvailable() == false) {
throw new RuntimeException("Declare the " + executorServiceClass.getSimpleName() + " in your manifest");
}
final Intent service = new Intent(context, executorServiceClass);
final RequestWrapper wrapper = new RequestWrapper(block, options);
final Integer requestId = addRequest(wrapper);
service.putExtra(KEY_ID, requestId);
context.startService(service);
return requestId;
}
public boolean isServiceAvailable() {
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(context, executorServiceClass);
final List<ResolveInfo> resolveInfo = packageManager.queryIntentServices(intent,
PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfo.size() > 0) {
return true;
}
return false;
}
}
cách dễ nhất là sử dụng gói khái niệm –
Bạn sử dụng các gói để gửi các đối tượng không phải là chuỗi hay gì đó? –
Không phải vì họ chỉ dạy bạn cách làm những việc cơ bản như dây ... –