1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.basicsyncadapter;
18 
19 import android.app.Service;
20 import android.content.Intent;
21 import android.os.IBinder;
22 import android.util.Log;
23 
24 /** Service to handle sync requests.
25  *
26  * <p>This service is invoked in response to Intents with action android.content.SyncAdapter, and
27  * returns a Binder connection to SyncAdapter.
28  *
29  * <p>For performance, only one sync adapter will be initialized within this application's context.
30  *
31  * <p>Note: The SyncService itself is not notified when a new sync occurs. It's role is to
32  * manage the lifecycle of our {@link SyncAdapter} and provide a handle to said SyncAdapter to the
33  * OS on request.
34  */
35 public class SyncService extends Service {
36     private static final String TAG = "SyncService";
37 
38     private static final Object sSyncAdapterLock = new Object();
39     private static SyncAdapter sSyncAdapter = null;
40 
41     /**
42      * Thread-safe constructor, creates static {@link SyncAdapter} instance.
43      */
44     @Override
onCreate()45     public void onCreate() {
46         super.onCreate();
47         Log.i(TAG, "Service created");
48         synchronized (sSyncAdapterLock) {
49             if (sSyncAdapter == null) {
50                 sSyncAdapter = new SyncAdapter(getApplicationContext(), true);
51             }
52         }
53     }
54 
55     @Override
56     /**
57      * Logging-only destructor.
58      */
onDestroy()59     public void onDestroy() {
60         super.onDestroy();
61         Log.i(TAG, "Service destroyed");
62     }
63 
64     /**
65      * Return Binder handle for IPC communication with {@link SyncAdapter}.
66      *
67      * <p>New sync requests will be sent directly to the SyncAdapter using this channel.
68      *
69      * @param intent Calling intent
70      * @return Binder handle for {@link SyncAdapter}
71      */
72     @Override
onBind(Intent intent)73     public IBinder onBind(Intent intent) {
74         return sSyncAdapter.getSyncAdapterBinder();
75     }
76 }
77