Tôi có một ứng dụng bao gồm một số hoạt động và tôi sử dụng Ngữ cảnh ứng dụng (được áp dụng từ Lớp ứng dụng và tôi đã liên tục) chia sẻ dữ liệu và đối tượng giữa tất cả các hoạt động. Tôi sử dụng Lớp Ứng dụng thay vì một dịch vụ nền vì một số lý do chính đáng, mà tôi sẽ không đi vào đây.Cách truy cập một bối cảnh ứng dụng đã chạy từ một dịch vụ Bộ điều hợp đồng bộ trong Android?
Gần đây tôi cũng đã thêm bộ điều hợp đồng bộ hóa liên hệ tùy chỉnh vào ứng dụng của mình. Nó nằm trong cùng một gói, trong cùng một APK. Vì vậy, tôi thiết lập nó để truy cập vào bối cảnh ứng dụng giống như mọi thứ khác trong ứng dụng của tôi để cung cấp cho nó quyền truy cập vào tất cả dữ liệu và đối tượng được chia sẻ. Tuy nhiên, mặc dù nó hoạt động (chủ yếu), nó tạo ra một thể hiện mới của Ngữ cảnh ứng dụng. Vì vậy, về cơ bản có hai trường hợp riêng biệt của ứng dụng đang chạy của tôi và dữ liệu không được chia sẻ giữa chúng.
Tôi nghĩ rằng vấn đề là ứng dụng của tôi không bao giờ bắt đầu dịch vụ đồng bộ hóa, hệ điều hành thực hiện. Tất cả các hoạt động khác của tôi hoặc là do ứng dụng khởi động hoặc hoạt động chính truy cập vào Ngữ cảnh ứng dụng khi nó khởi chạy và sau đó App Context kiểm soát mọi thứ khác. Có cách nào để có dịch vụ đồng bộ truy cập vào bối cảnh ứng dụng hiện có, thay vì tạo ra thể hiện mới của nó?
Dưới đây là cấu trúc cơ bản của ứng dụng của tôi:
Ứng dụng
package com.mycomany.myapp;
public class MyApp extends Application{
...
}
Activity1
package com.mycomany.myapp;
public class MyActivity1 extends Activity{
MyApp a;
@Override
public void onCreate(Bundle savedInstanceState){
a = (MyApp) getApplicationContext();
...
}
}
SyncAdapterService
package com.mycomany.myapp;
public class SyncAdapterService extends Service {
private static SyncAdapterImpl sSyncAdapter = null;
private static final Object sSyncAdapterLock = new Object();
private static ContentResolver mContentResolver = null;
private static MyApp a;
public SyncAdapterService() {
super();
}
private static class SyncAdapterImpl extends AbstractThreadedSyncAdapter {
private Context mContext;
public SyncAdapterImpl(Context context) {
super(context, true);
mContext = context;
}
@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
try {
SyncAdapterService.performSync(mContext, account, extras, authority, provider, syncResult);
} catch (OperationCanceledException e) {}
}
}
@Override
public void onCreate() {
super.onCreate();
synchronized (sSyncAdapterLock) {
if(a == null){
a = (MyApp) getApplicationContext();
}
if (sSyncAdapter == null) {
sSyncAdapter = new SyncAdapterImpl(getApplicationContext());
}
}
}
@Override
public IBinder onBind(Intent intent) {
return sSyncAdapter.getSyncAdapterBinder();
}
private static void performSync(Context context, Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult)
throws OperationCanceledException {
...
}
}
Xin lỗi - Tôi đã tìm ra điều này trong một thời gian dài trước đây, nhưng quên để gửi các giải pháp – user496854
Không có vấn đề. Tôi chỉ có khá nhiều tình huống tương tự và vấp phải câu hỏi này. SyncAdapter của tôi đã ghi đè Apps SharedDefaultPreferences và ngược lại (Đó là chủ đề nhưng không xử lý an toàn). –
Cảm ơn Michael ... Nó cũng giúp giải quyết vấn đề của tôi ... – Ram