2011-11-05 17 views
5

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 { 
... 
    } 
} 

Trả lời

7

Bạn đã sao chép & đã dán khóa đào tạo này cho SyncAdapter http://developer.android.com/training/sync-adapters/creating-sync-adapter.html?

Cuối cùng có XML này Snippet:

<service 
      android:name="com.example.android.datasync.SyncService" 
      android:exported="true" 
      android:process=":sync"> 
     <intent-filter>com.example.android.datasync.provider 
      <action android:name="android.content.SyncAdapter"/> 
     </intent-filter> 
     <meta-data android:name="android.content.SyncAdapter" 
       android:resource="@xml/syncadapter" /> 
    </service> 

Với android thuộc tính: Quá trình = ": đồng bộ" có nghĩa là bạn tạo ra một quá trình đồng bộ hóa riêng. Loại bỏ nó và bạn tốt để đi.

+0

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

+0

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). –

+0

Cảm ơn Michael ... Nó cũng giúp giải quyết vấn đề của tôi ... – Ram

1

Bạn có thể muốn xem xét ràng buộc dịch vụ với ngữ cảnh Ứng dụng của mình. Bằng cách đó, nếu ngữ cảnh ứng dụng của bạn không tồn tại, dịch vụ sẽ không tồn tại, vì nó chạy trong cùng một tiến trình (của ứng dụng). Xem bindSerivce()

Nếu dịch vụ của bạn là một trong những từ xa hãy thử sử dụng callbacks

+1

Tôi không chắc chắn điều đó có thể - đó là dịch vụ bộ điều hợp đồng bộ hóa, vì vậy ứng dụng của tôi về mặt kỹ thuật không bao giờ tương tác với nó. Nó được kích hoạt (được tạo và bị ràng buộc) bởi trình phân giải nội dung khi nó kích hoạt đồng bộ hóa. Làm thế nào tôi có thể liên kết nó với ứng dụng của tôi? – user496854

1

Bạn vẫn gặp vấn đề này? Nếu dịch vụ được khai báo trong tệp kê khai của bạn mà không chỉ định một quy trình android: khác, nó có phải chạy trong quy trình mặc định do tác vụ của bạn xác định không? Bạn không thể trong trường hợp đó chỉ cần sử dụng getApplicationContext để có được những gì bạn cần? Tôi có bộ điều hợp đồng bộ hóa được triển khai theo cách này và đang hoạt động theo cách này và đang hoạt động

+0

Nó nên, nhưng đối với một số lý do nó không.getApplicationContext kéo lên một thể hiện ứng dụng khác nhau – user496854

+0

để bộ điều hợp đồng bộ của bạn không nằm trong một dự án riêng biệt (với một tệp kê khai khác) không có quy trình khác được chỉ định trong tệp kê khai? – kingston

+0

Phải có điều gì đó sai hoặc bị hỏng với dự án Eclipse của tôi, hoặc tôi có thể đã bỏ sót điều gì đó trong tệp kê khai. Tôi đã kết thúc việc tạo một dự án mới từ đầu, sao chép tất cả các tệp nguồn java và sau đó tạo lại tệp kê khai từ đầu. Một khi tôi đã làm điều đó, tất cả mọi thứ đã làm việc như nó phải - getApplicationContext làm việc chính xác như nó được cho là. Tôi vẫn không biết những gì đã gây ra các dự án ban đầu để được hơi say lên như vậy – user496854

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